如何在SQL Server中比较两列是否相等?

时间:2009-10-27 18:33:45

标签: sql sql-server tsql

我有两个列在某些条件下连接在一起,但我还要检查两个列,看看两个其他列是否相同,然后返回一个位字段,如果它们是。

是否有比使用CASE WHEN更简单的解决方案?

理想情况下我可以使用:

    SELECT Column1 = Column2 AS MyDesiredResult
      FROM Table1
INNER JOIN Table2 ON Table1.PrimaryKey = Table2.ForeignKey

7 个答案:

答案 0 :(得分:49)

CASE对此有什么不妥?为了查看结果,您至少需要一个字节,这就是您使用单个字符获得的结果。

CASE WHEN COLUMN1 = COLUMN2 THEN '1' ELSE '0' END AS MyDesiredResult

应该可以正常工作,并且所有意图和目的都与使用位字段完成相同的事情。

答案 1 :(得分:1)

我也会使用CASE WHEN

根据您实际想要做的事情,可能还有其他选项,例如使用外部联接或其他任何选项,但在这种情况下,这似乎不是您所需要的。

答案 2 :(得分:1)

避免CASE WHEN的解决方案是使用COALESCE

SELECT
    t1.Col2 AS t1Col2,
    t2.Col2 AS t2Col2,
    COALESCE(NULLIF(t1.Col2, t2.Col2),NULLIF(t2.Col2, t1.Col2)) as NULL_IF_SAME
 FROM @t1 AS t1
JOIN @t2 AS t2 ON t1.ColID = t2.ColID

NULL_IF_SAME列会为NULL(包括t1.col2 = t2.col2)的所有行提供NULL。 虽然这不比CASE WHEN表达式更具可读性,但它是ANSI SQL。

只是为了好玩,如果想要布尔位值为0和1(虽然它不是非常易读,因此不推荐),可以使用(适用于所有数据类型):

1/ISNULL(LEN(COALESCE(NULLIF(t1.Col2, t2.Col2),NULLIF(t2.Col2, t1.Col2)))+2,1) as BOOL_BIT_SAME.

现在,如果你有一个数字数据类型和想要的位,在上面的LEN函数中首先转换为字符串,这可能有问题,所以相反这应该有效:

1/(CAST(ISNULL(ABS(COALESCE(NULLIF(t1.Col2, t2.Col2),NULLIF(t2.Col2, t1.Col2)))+1,0)as bit)+1) as FAST_BOOL_BIT_SAME_NUMERIC

上面适用于没有CAST的整数。

注意:同样在SQLServer 2012中,我们有IIF函数。

答案 3 :(得分:1)

  

使用情况是更好的选择

# -*- coding: <encoding name> -*-

答案 4 :(得分:0)

关于David Elizondo的回答,这可能会产生误报。它也不会在值不匹配的地方给出零。

代码

DECLARE @t1 TABLE (
    ColID   int     IDENTITY,
    Col2    int
)

DECLARE @t2 TABLE (
    ColID   int     IDENTITY,
    Col2    int
)

INSERT INTO @t1 (Col2) VALUES (123)
INSERT INTO @t1 (Col2) VALUES (234)
INSERT INTO @t1 (Col2) VALUES (456)
INSERT INTO @t1 (Col2) VALUES (1)

INSERT INTO @t2 (Col2) VALUES (123)
INSERT INTO @t2 (Col2) VALUES (345)
INSERT INTO @t2 (Col2) VALUES (456)
INSERT INTO @t2 (Col2) VALUES (2)

SELECT
    t1.Col2 AS t1Col2,
    t2.Col2 AS t2Col2,
    ISNULL(NULLIF(t1.Col2, t2.Col2), 1) AS MyDesiredResult
FROM @t1 AS t1
JOIN @t2 AS t2 ON t1.ColID = t2.ColID

结果

     t1Col2      t2Col2 MyDesiredResult
----------- ----------- ---------------
        123         123               1
        234         345             234 <- Not a zero
        456         456               1
          1           2               1 <- Not a match

答案 5 :(得分:0)

使用IIF?而且取决于SQL Server的版本。

SELECT
IIF(Column1 = Column2, 1, 0) AS MyDesiredResult
FROM Table;

答案 6 :(得分:-2)

我能想到的最接近的方法是 NULLIF

SELECT 
    ISNULL(NULLIF(O.ShipName, C.CompanyName), 1),
    O.ShipName,      
    C.CompanyName,
    O.OrderId
FROM [Northwind].[dbo].[Orders] O
INNER JOIN [Northwind].[dbo].[Customers] C
ON C.CustomerId = O.CustomerId

GO

NULLIF 会返回第一个表达式如果两个表达式不相等。如果表达式相等,则NULLIF返回第一个表达式类型的空值。

因此,对于那些列相等的记录,上面的查询将返回 1 ,否则返回第一个表达式