CASE错误地返回true

时间:2018-08-02 17:17:56

标签: sql oracle oracle-sqldeveloper

我有一个SELECT CASE WHEN表达式,与下面的示意图大致相同:

SELECT TelephoneNumber,
  CASE WHEN TelephoneNumber IN
    (
     SELECT TelephoneNumber
     FROM ....
    )
  THEN 'True' ELSE 'False' END AS CheckCol
FROM Table1
;

如果子目录中存在数字,我希望在TelephoneNumber列中获得数字列表,并在True列中获得相应的FalseCheckCol字符串-选择。

相反,我最终得到的是True,即使子选择中未返回TelephoneNumber

我缺少什么/做错了什么?

编辑:此后,我已经确定了问题所在。我在子查询中丢失了一个内部联接,这意味着它实际上返回了所有内容,即使我认为应该没有。

3 个答案:

答案 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不在子查询的任何表中。