Есть ли способ переписать оператор Transact SQL, который использует структуру CASE WHEN, чтобы сделать то же самое без использования CASE WHEN?
Я использую продукт со встроенным конструктором запросов и собственным псевдо-SQL. У него есть ограничения на то, что я могу использовать с SQL Server и Oracle. Итак, у меня есть этот столбец, который, когда базовой базой данных является Oracle, использует DECODE (который поддерживается). Однако мне нужно заставить его работать с SQL Server, а CASE WHEN не поддерживается.
Заявление, которое я пытаюсь преобразовать, похоже на
Decode (StatusColumn, 'Value 1',
Decode(Sign(Now()-TargetDateColumn)),1,'Past
Due', 'Outstanding'), 'Value 2',
Decode(Sign(Now()-TargetDateColumn)),1,'Past
Due', 'Outstanding'), 'Value 3',
Decode(Sign(Now()-TargetDateColumn)),1,'Past
Due', 'Outstanding'), 'Value 4')
У меня есть ограниченный набор параметров T-SQL для использования, и CASE WHEN не вариант. У меня есть IsNull и Coalesce, но я не уверен, помогут ли они мне с этим.
Не беспокойтесь о расчетах даты, они решены.
Я искал здесь вопросы CASE WHEN, но безрезультатно.
Спасибо!
Обновление:
Я понимаю, что должен был дать более подробную информацию о причине ограничений, так как это ресурс разработчика, и можно было бы предположить, что это продукт разработки. Нет, это не так.
Я использую корпоративный программный продукт со встроенным конструктором запросов и собственным псевдо-SQL. У него есть ограничения на то, что я могу использовать с SQL Server и Oracle. По сути, все, что не нарушает синтаксический анализ встроенного механизма запросов, является игрой. Это означает все санкционированные функции и выражения, плюс все абстракции данных (внутренние объекты, соответствующие физической таблице в базе данных, и другие запросы, созданные с помощью продукта), плюс все из Oracle SQL или Transact SQL, которые явно не нарушают синтаксический анализ. .
Причина, по которой CASE WHEN у меня не работает, заключается в том, что он нарушает синтаксический анализ псевдо-SQL механизмом запросов.
В конечном счете, я хотел бы попробовать:
- Используйте только конструктор запросов продукта SQL, который проходит синтаксический анализ ИЛИ
- Используйте несколько дополнительных ресурсов из базы данных SQL Server и конструктора запросов, чтобы сделать это.
Основываясь на нескольких хороших ответах, которые я получил, вот подход, который до сих пор работал для меня.
Джейсон ДеФонтес предложил мне использовать представление базы данных для выполнения правил CASE WHEN, и это относится к пункту 2 выше. Это работает для меня, потому что представление достаточно динамично, и мне не нужно его обслуживать (в отличие от подхода к таблицам истинности Richartallent, который, я считаю, близок к подходу Джейсона). Предложение Паскаля о создании функции будет идти в том же направлении, но, вероятно, нарушит синтаксический анализ.
Итак, я создал представление базы данных, которое выполняет все преобразования с помощью CASE WHEN, и я добавил его в свой SQL-запрос, соединил его с существующим SQL, и все заработало нормально. Я понимаю, что, вероятно, добавляю нагрузку на механизм базы данных, так как ему придется дважды извлекать один и тот же набор данных (один для представления и один для запроса), но это один из тех случаев, когда это вряд ли проблема.
Учитывая, что этот дизайн «использовать представление для его запутывания» работает для меня, мне интересно, какой подход будет более эффективным:
- Использование выбора с CASE WHEN;
- Используя CTE (опять же, Richardtallent);
- Использование объединения всех (HLGEM);
- Использование подзапросов (MisterZimbu);
Я все равно проверю предложение Арамиса Уайлера, так как оно, вероятно, может попасть в пункт № 1 выше.
На данный момент ответ Джейсона был принят. Учитывая, что я использовал CASE WHEN в представлении, возможно, заголовок вопроса оказался неудачно выбранным. Я поднял всех, кто предложил что-то, что помогло в этом процессе. Я не знаю, повлияет ли это на твою репутацию или нет, но я подумал, что это хороший поступок.
Еще раз, я хочу поблагодарить вас всех за вашу помощь и попросить вас отредактировать что-либо по вопросу, который вам не подходит (это мой первый вопрос, а английский - мой второй язык).