Связанный подзапрос SQL в пункте случая

действительно ли возможно записать подзапрос в рамках пункта случая для когда оператор

т.е.

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

Спасибо!

6
задан Peter Rankin 7 January 2016 в 16:26
поделиться

3 ответа

можно ли написать подзапрос в случае оговорки о том, когда заявление

Я думаю, что это то, о чем вы просите:

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;

Возможно ли что-то сделать на основе в этом столбце значений?

Вы МОЖЕТЕ сделать это, при этом во втором выражении CASE используется colA, а не colC:

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 и т. Д.):

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.

4
ответ дан 17 December 2019 в 00:02
поделиться

Операторы Case оцениваются в одно значение, поэтому вы не можете возвращать из них несколько столбцов. Вы можете использовать коррелированные подзапросы в предложении Where, хотя вы не показали пример, где вы пытались это использовать. Будет ли colC работать в предложении Where или нет, зависит от вашего движка базы данных. Я работал с некоторыми, которые работают, и с другими, которые требуют повторного выполнения подзапроса в предложении Where.

2
ответ дан 17 December 2019 в 00:02
поделиться

можно ли написать подзапрос в предложении case для оператора when

Да. Как ответил g.d.d.c, это должен быть подзапрос, возвращающий единственное значение. Это означает ноль или одну строку и один столбец или значение.

Можно ли что-то сделать на основе этого столбца значений?

Да, с теми же оговорками, что и выше.

Кроме того, разрешено ли в приведенном выше случае возвращать несколько разных столбцов в зависимости от того, какое значение имеет colC?

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

1
ответ дан 17 December 2019 в 00:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: