我有一个SELECT CASE WHEN表达式,与下面的示意图大致相同:
SELECT TelephoneNumber,
CASE WHEN TelephoneNumber IN
(
SELECT TelephoneNumber
FROM ....
)
THEN 'True' ELSE 'False' END AS CheckCol
FROM Table1
;
如果子目录中存在数字,我希望在TelephoneNumber
列中获得数字列表,并在True
列中获得相应的False
或CheckCol
字符串-选择。
相反,我最终得到的是True
,即使子选择中未返回TelephoneNumber
。
我缺少什么/做错了什么?
编辑:此后,我已经确定了问题所在。我在子查询中丢失了一个内部联接,这意味着它实际上返回了所有内容,即使我认为应该没有。
答案 0 :(得分:2)
您应该改为在FROM子句中创建具有适当联接的查询。使用外部联接,然后检查null
SELECT Table1.TelephoneNumber,
CASE WHEN Table2.TelephoneNumber IS NOT NULL THEN
'True' ELSE 'False'
END AS CheckCol
FROM Table1
left outer join Table2
ON Table1.TelephoneNumber = Table2.TelephoneNumber
请参阅以下注释,如果 Table2
包含多个具有相同TelephoneNumber
值的条目,那么您应在Distinct
之后添加SELECT
避免在结果集中返回重复的值。
相同的查询,但是使用“旧”联接语法,其中在FROM
中标识表,在WHERE
子句中标识联接。我相信(+)
处于恋爱关系的正确终点。
SELECT Table1.TelephoneNumber,
CASE WHEN Table2.TelephoneNumber IS NOT NULL THEN
'True' ELSE 'False'
END AS CheckCol
FROM Table1, Table2
WHERE Table1.TelephoneNumber = Table2.TelephoneNumber(+)
答案 1 :(得分:0)
您似乎想要exists
:
select t1.TelephoneNumber, (case when exists (select 1
from table2 t2
where t1.TelephoneNumber = t2.TelephoneNumber
)
then 'Yes' else 'No'
end) as CheckCol
from table1 t1;
答案 2 :(得分:0)
如果TelephoneNumber
实际上不在子查询中,则会发生这种情况。您应该总是限定列名。试试这个:
SELECT t1.TelephoneNumber,
(CASE WHEN t1.TelephoneNumber IN (SELECT t2.TelephoneNumber
FROM table2 t2 . . .
)
THEN 'True'
ELSE 'False'
END) AS CheckCol
FROM Table1 t1;
我的猜测是这将返回错误,因为TelephoneNumber
不在子查询的任何表中。