Случай, когда в союзе? - PullRequest
       29

Случай, когда в союзе?

1 голос
/ 12 ноября 2011

Вот мой код:

SELECT 'Add or remove a keyword' AS 'Keyword', '1' AS 'row number'
UNION
SELECT '---------------------', '2'
UNION
SELECT 
   CASE
   WHEN @list_item = 'duration'
   THEN (SELECT duration FROM durationTable)
   END
   CASE
   WHEN @list_item = 'location'
   THEN (SELECT location FROM locationTable)
   END
, '3'
ORDER BY 2

Проблема в том, что в этом случае длительность и местоположение выбираются как подзапросы, а подзапросы ограничиваются только одним результатом, и, кроме того, я не могу определить правильный синтаксис для поднятия моего CASE до уровня, чтобы запросы не являются подзапросами.

Есть ли способ, которым я могу сохранить структуру, которую позволяет мне объединение / выбор, и в то же время изменить, какая таблица запрашивается для последнего бита, а также получить весь столбец таблицы вместо одного результата?

Какие-нибудь советы? Большое спасибо за внимание!

Ответы [ 3 ]

2 голосов
/ 12 ноября 2011

Во-первых, вы должны знать, что это плохой дизайн. Вы смешиваете свой уровень представления и уровень данных, и это приведет к проблемам в будущем.

Однако, если вы абсолютно привержены этому, вы можете сделать это с дополнительным SELECT:

...
UNION

SELECT duration FROM durationTable, '3'
WHERE @list_item = 'duration'

UNION

SELECT location FROM locationTable, '3'
WHERE @list_item = 'location'
...

Несоответствующий запрос вернет пустой набор результатов и будет проигнорирован.

0 голосов
/ 22 сентября 2015
SELECT 'Add or remove a keyword' AS 'Keyword', '1' AS 'row number'
UNION
SELECT '---------------------', '2'
UNION
SELECT duration,3 FROM durationTable WHERE @list_item = 'duration'
UNION
SELECT location,3 FROM locationTable WHERE @list_item = 'location'
0 голосов
/ 12 ноября 2011

Это не красиво, но я думаю, что это должно работать:

SELECT 'Add or remove a keyword' AS 'Keyword', '1' AS 'row number'
UNION
SELECT '---------------------', '2'
UNION
SELECT duration, '3' FROM durationTable WHERE 1 = (SELECT CASE WHEN @list_item = 'duration' THEN 1 ELSE 0 END)
UNION
SELECT location, '3' FROM locationTable WHERE 1 = (SELECT CASE WHEN @list_item = 'location' THEN 1 ELSE 0 END)
...