действительно ли возможно записать подзапрос в рамках пункта случая для когда оператор
т.е.
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
Спасибо!
можно ли написать подзапрос в случае оговорки о том, когда заявление
Я думаю, что это то, о чем вы просите:
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.
Операторы Case оцениваются в одно значение, поэтому вы не можете возвращать из них несколько столбцов. Вы можете использовать коррелированные подзапросы в предложении Where, хотя вы не показали пример, где вы пытались это использовать. Будет ли colC
работать в предложении Where или нет, зависит от вашего движка базы данных. Я работал с некоторыми, которые работают, и с другими, которые требуют повторного выполнения подзапроса в предложении Where.
можно ли написать подзапрос в предложении case для оператора when
Да. Как ответил g.d.d.c, это должен быть подзапрос, возвращающий единственное значение. Это означает ноль или одну строку и один столбец или значение.
Можно ли что-то сделать на основе этого столбца значений?
Да, с теми же оговорками, что и выше.
Кроме того, разрешено ли в приведенном выше случае возвращать несколько разных столбцов в зависимости от того, какое значение имеет colC?
Нет. Подзапрос должен возвращать ноль или одну строку и только один столбец или значение.