2012-01-10 3 views
5

Я разрабатываю динамический SQL-запрос, который проверяет исходную таблицу на целевой таблице. Я хотел бы сравнить строки источника с строками цели, чтобы проверить различия.Сравнение NULL

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-col1 имеет значение null, а table-b col1 имеет значение null, то я считаю их равными.

Я знаю, что могу помещать ISNULL вокруг своих столбцов, но это динамический запрос, который создается, поэтому я знаю только имя столбца, а не тип данных.

Любые предложения?

ответ

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.*) 
+0

Что делать, если (хотя, я думаю, это маловероятно из-за имени) поле 'key' равно NULL? 'ON (B.KEY = A.KEY ИЛИ (A.KEY NULL AND B.KEY NULL))'? – MatBailie

+0

@ Dems - Это не (или, по крайней мере, вопрос только упоминает 'col1, col2'). –

+0

Спасибо! Работает отлично! – user829237

2

Как насчет IS NULL?

Edit: Обновленный запрос к ответственности за бот ч столбцы являются нуль ... получать долго и некрасиво, но работает ...

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))) 
+0

Что делать, если оба значения NULL? – MatBailie

+0

Хороший улов, редактирование –

0

Если TABLE_A и TABLE_B имеют одинаковые столбцы. Вы можете попробовать

SELECT * FROM TABLE_A 
EXCEPT 
SELECT * FROM TABLE_B 
+0

Это не то же самое. Он должен возвращать строки, где совпадают ключи, но один из других столбцов отличается. Это дополнительно возвращает строки в 'TABLE_A' без соответствующего ключа в' TABLE_B' –

+0

Извините, но таблицы не имеют одинаковых столбцов. Но спасибо за ваш ответ – user829237

Смежные вопросы