是否可以在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
扩展问题:
是否可以根据该值列执行某些操作? (非常肯定是的,但是想要确认)
即
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
谢谢!
答案 0 :(得分:4)
是否可以编写子查询 在一个案例条款中的时间 声明
我认为这就是你要求的:
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
,考虑到“不起作用”的默认值。] < / p>
但是,我想你是否可以在同一个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的要求。
答案 1 :(得分:2)
Case语句计算为单个值,因此您无法从它们返回多个列。您可以在Where子句中使用相关子查询,但是您没有显示尝试使用该子查询的示例。 colC
是否适用于Where子句将取决于您的数据库引擎。我和其他人一起工作,还有其他人要求你在Where子句中重新运行子查询。
答案 2 :(得分:1)
是否可以在if语句的case子句中编写子查询
是。正如g.d.d.c回答的那样,它必须是一个返回单个值的子查询。这意味着零行或一行,一列或一个值。
是否可以根据该值列执行某些操作?
是的,与上述相同。
此外,上述情况是否允许根据colC的值来返回多个不同的列?
没有。子查询必须返回零行或一行,只返回一列或值。