SQL коррелированный подзапрос в предложении case
можно ли написать подзапрос в предложении case для оператора when
ie.
SELECT colA, colB,
CASE WHEN (SELECT colA FROM tab2 WHERE tab2.colA = tab1.colA) THEN '1'
CASE WHEN (SELECT colA FROM tab3 WHERE tab3.colA = tab3.colA) THEN '2'
ELSE '0'
END AS colC,
...
FROM tab1
расширенный вопрос:
Можно ли что-то сделать на основе этого столбца значений? (довольно уверен, да, но хотел бы подтверждение)
то есть.
CASE
WHEN colC = '1' THEN ( select colR FROM...),
WHEN colC = '2' THEN (SELECT ColS FROM...),
ELSE 'doesn't work'
END AS colD
кроме того, в приведенном выше случае разрешено возвращать несколько и разные столбцы в зависимости от того, какое значение colC?
то есть.
CASE
WHEN colC = '1' THEN ( select colR, colV, colX FROM...),
WHEN colC = '2' THEN (SELECT ColS, ColD FROM...),
ELSE 'doesn't work'
END AS colD
спасибо!
3 ответов
можно ли написать подзапрос в предложении case для when заявление
Я думаю, что это то, что вы просите:
SELECT colA, colB,
CASE
WHEN EXISTS (SELECT * FROM tab2 WHERE tab2.colA = tab1.colA)
THEN '1'
WHEN EXISTS (SELECT * FROM tab3 WHERE tab3.colA = tab3.colA)
THEN '2'
ELSE '0'
END AS colC
FROM tab1;
можно ли сделать что-то на основе в этом столбце значений?
вы можете сделать это, который использует колу, а не colC во втором CASE
выражение:
SELECT colA, colB,
CASE
WHEN EXISTS (SELECT * FROM tab2 WHERE tab2.colA = tab1.colA)
THEN '1'
WHEN EXISTS (SELECT * FROM tab3 WHERE tab3.colA = tab3.colA)
THEN '2'
ELSE '0'
END AS colC,
CASE
WHEN colA = '1' THEN (SELECT colA FROM tab2)
WHEN colA = '2' THEN (SELECT colB FROM tab3)
ELSE 'doesn''t work'
END AS colD
FROM tab1;
[Примечание вам нужно быть осторожным о бросать результат второй CASE
выражение для общего типа данных, предположительно VARCHAR
учитывая значение по умолчанию"не работает".]
однако, я думаю, что вы спрашиваете, можете ли вы 'повторно использовать результат CASE
выражения в том же SELECT
предложение, в этом случае colC. Ответа на это нет, потому что имя корреляции не находится в области видимости**. Конечно, вы можете обернуть его в подзапрос (или CTE
, VIEW
, etc):
SELECT DT1.colA, DT1.colB, DT1.colC,
CASE
WHEN DT1.colC = '1' THEN (SELECT colA FROM tab2)
WHEN DT1.colC = '2' THEN (SELECT colB FROM tab3)
ELSE 'doesn''t work'
END AS colD
FROM (
SELECT colA, colB,
CASE
WHEN EXISTS (SELECT * FROM tab2 WHERE tab2.colA = tab1.colA)
THEN '1'
WHEN EXISTS (SELECT * FROM tab3 WHERE tab3.colA = tab3.colA)
THEN '2'
ELSE '0'
END AS colC
FROM tab1
) AS DT1;
Примечание
* * я основываю свой знание стандартного SQL, а не db2. MS Access, например, позволяет использовать имена корреляции столбцов в том же SELECT
предложение справа налево, но это просто подтверждает, что Access не реализует язык SQL!
может ли вышеуказанный случай вернуться несколько и разные столбцы в зависимости от того, какое значение colC
разные столбцы да, несколько столбцов нет. Подумайте об этом:CASE
выражение возвращает значение, так какой тип данных будет значение два столбца? Таблица, список, массив и т. д.? Скалярные значения-это требование для 1NF.
операторы Case оцениваются в одно значение, поэтому вы не можете вернуть несколько столбцов из них. Вы можете использовать коррелированные подзапросы в предложении where, если вы не покажите пример, где вы пытались использовать. Ли colC
будет работать в предложении Where будет зависеть от вашего ядра СУБД. Я работал с некоторыми из них, а другие требуют повторного запуска подзапроса в предложении Where.
можно ли написать подзапрос в предложении case для оператора when
да. Как Г. d.d.c ответил, Это должен быть подзапрос, который возвращает одно значение. Это означает ноль или одну строку и один столбец или значение.
можно ли что-то сделать на основе этого столбца значений?
да, с теми же оговорками, что и выше.
кроме того, в приведенном выше случае разрешено возвращать несколько и разные столбцы в зависимости от значения colC?
нет. Вложенный запрос должен возвращать ноль или одну строку и только один столбец или значение.