为什么SQL CASE返回true和false?

时间:2015-01-14 21:10:29

标签: sql sql-server

我在SQL中遇到了一个令人困惑的问题。不知何故,CASE语句中的JOIN返回TRUE和FALSE!

如果您运行以下(我正在使用SQL Server 2008),您将看到效果。 JOIN根据CASE语句创建2条记录。

如何阻止这种想法?

CREATE TABLE #table1(id int PRIMARY KEY, fieldA nvarchar(MAX))
    INSERT INTO #table1
    SELECT 1, 'ABC Airlines'


    CREATE TABLE #table2(field_id int PRIMARY KEY, fieldB nvarchar(MAX))
    INSERT INTO #table2
    SELECT 1, 'ABC Airlines'
    UNION
    SELECT 2, '*** OTHER ***'

    SELECT  * 
    FROM    #table1 t
    JOIN    #table2 t2 ON t2.fieldB =  CASE WHEN t.fieldA <> t2.fieldB THEN '*** OTHER ***' ELSE t.fieldA END

4 个答案:

答案 0 :(得分:1)

您似乎使用#table2.fieldB作为JOIN条件,因此您获得了2个值(&#39; ABC Airlines&#39;以及&#39;其他&#39;)。如果以这种方式更改查询,则可以实现预期结果

SELECT  * 
FROM    #table1 t
JOIN    #table2 t2 ON t.fieldA = CASE WHEN t.fieldA <> t2.fieldB THEN '*** OTHER ***' ELSE t2.fieldB END

答案 1 :(得分:0)

何时将数据插入#table1&amp; #table2然后你的表将如下所示

表1

id fieldA

1 ABC航空公司

表2

id fieldB

1 ABC航空公司

2 * OTHER *

现在,当您加入两个表时,您的情况表明,如果fieldA不等于fieldB,那么&#39; * OTHER &#39;否则为fieldA,因此当ABC航空公司&lt;&gt; 其他 时,您传递 < / strong> 其他* 作为替代品加入时。因此,对于两行,数据将匹配,您将获得两个结果。请根据您的要求更改案件条件

答案 2 :(得分:0)

为什么你不想要:

SELECT  * 
FROM    #table1 t
JOIN    #table2 t2 ON t.fieldA =  t2.fieldB 

在连接中使用case语句和不等式是一种不好的做法。根据您的最终结果,您想要的只是一个普通的内部联接。

答案 3 :(得分:0)

为什么不这样做?

SELECT  * 
FROM #table1 t JOIN
     #table2 t2
     ON t2.fieldB = t.fieldA OR t2.fieldB = '*** OTHER ***' ;

fieldA NULL apply select * from #table1 t apply (select top 1 t2.* from #table2 t2 where t2.fieldB = t.fieldA or t2.fieldB = '*** OTHER ***' order by (case when t2.fieldB = t.fieldA then 1 else 2 end) ) t2; 时,这与您的逻辑不相同,但这似乎不是您数据的问题。

但我的猜测是,当根本不匹配时,您需要“ * OTHER * ”值。这不是你的逻辑会做的。如果是这种情况,那么{{1}}解决了问题:

{{1}}