是否可以在if语句的case子句中编写子查询
即.
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
Run Code Online (Sandbox Code Playgroud)
扩展问题:
是否可以根据该值列执行某些操作?(非常肯定是的,但想要确认)
即.
CASE
WHEN colC = '1' THEN ( select colR FROM...),
WHEN colC = '2' THEN (SELECT ColS FROM...),
ELSE 'doesn't work'
END AS colD
Run Code Online (Sandbox Code Playgroud)
此外,上述情况是否允许根据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
Run Code Online (Sandbox Code Playgroud)
谢谢!
是否可以在 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;
Run Code Online (Sandbox Code Playgroud)
是否可以根据该值列执行某些操作?
您可以这样做,它在第二个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;
Run Code Online (Sandbox Code Playgroud)
[请注意,将第二个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;
Run Code Online (Sandbox Code Playgroud)
笔记
** 我的知识基于标准 SQL 而不是 db2。例如,MS Access 允许您以SELECT从右到左的方式在同一子句中使用列相关名称,但这只是确认 Access 没有实现 SQL 语言!
上述情况是否允许根据 colC 的值返回多个不同的列
不同的列是,多列不是。想一想:CASE表达式返回一个值,那么两列的值是什么数据类型?表、列表、数组等?标量值是 1NF 的要求。
| 归档时间: |
|
| 查看次数: |
16791 次 |
| 最近记录: |