比较NULL

时间:2012-01-10 15:30:05

标签: sql sql-server-2008 tsql

我正在设计一个动态SQL查询,它将针对目标表检查源表。我想比较源的行与目标的行,以检查差异。

CREATE TABLE TABLE_A (KEY INT, COL1 INT, COL2 INT)
CREATE TABLE TABLE_B (KEY INT, COL1 INT, COL2 INT)

所以我创建了这个声明:

SELECT A.* FROM TABLE_A A
INNER JOIN TABLE_B B
ON B.KEY = A.KEY
AND (B.COL1<>A.COL1 OR B.COL2<>A.COL2)

但只有col1和col2的值不为空时,这才有效。 如果table-a col1为null且table-b col1为null,那么我认为它们相等。

我知道我可以在我的列周围添加一个ISNULL,但这是一个正在构建的动态查询,因此我只知道列名而不是数据类型。

有什么建议吗?

3 个答案:

答案 0 :(得分:9)

您可以使用this approach

SELECT A.* 
FROM TABLE_A A
INNER JOIN TABLE_B B
ON B.KEY = A.KEY
WHERE NOT EXISTS (SELECT A.* 
                  INTERSECT 
                  SELECT B.* )

答案 1 :(得分:2)

IS NULL怎么样?

编辑:更新了查询以解释bot h列为空...变得冗长而丑陋,但正在工作......

SELECT A.* FROM TABLE_A A
INNER JOIN TABLE_B B
ON B.KEY = A.KEY
AND ((B.COL1<>A.COL1 OR (A.COL1 IS NULL AND B.col1 IS NOT NULL) OR (B.COL1 IS NULL AND A.col1 IS NOT NULL ))
OR (B.COL2<>A.COL2 OR (A.COL2 IS NULL AND B.col2 IS NOT NULL) OR (B.COL2 IS NULL AND A.col2 IS NOT NULL )))

答案 2 :(得分:0)

如果TABLE_A和TABLE_B具有相同的列。你可以试试这个

SELECT  * FROM TABLE_A
EXCEPT 
SELECT  * FROM TABLE_B