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?

нет. Вложенный запрос должен возвращать ноль или одну строку и только один столбец или значение.