Ich weiß, dass Sie einen Wert nicht mit NULL vergleichen können und ein Ergebnis erwarten können, ohne etwas wie den folgenden Code hinzuzufügen ...
SELECT
*
FROM
A INNER JOIN
B ON A.ID = B.ID
WHERE
A.STRING <> B.STRING OR (A.STRING IS NULL AND B.STRING IS NOT NULL) OR (A.STRING IS NOT NULL AND B.STRING IS NULL) OR
A.DT <> B.DT OR (A.DT IS NULL AND B.DT IS NOT NULL) OR (A.DT IS NOT NULL AND B.DT IS NULL) OR
A.B <> B.B OR (A.B IS NULL AND B.B IS NOT NULL) OR (A.B IS NOT NULL AND B.B IS NULL) OR
A.NUM <> B.NUM OR (A.NUM IS NULL AND B.NUM IS NOT NULL) OR (A.NUM IS NOT NULL AND B.NUM IS NULL)
Meine Frage ist:
Gibt es eine elegantere Methode zum Testen auf geänderte Werte in den beiden Tabellen, in denen einer null sein kann?
Die Lösung muss für alle Datentypen einheitlich funktionieren.
Hier ist der Code zum Einrichten der Testtabellen ...
CREATE TABLE A
(
ID INT IDENTITY(1,1) NOT NULL,
STRING VARCHAR(20) NULL,
DT DATETIME NULL,
B BIT NULL,
NUM INT NULL
)
CREATE TABLE B
(
ID INT IDENTITY(1,1) NOT NULL,
STRING VARCHAR(20) NULL,
DT DATETIME NULL,
B BIT NULL,
NUM INT NULL
)
INSERT INTO A (STRING, DT, B, NUM) VALUES ('TEST', '2012-03-16 16:39:04.893', 0, 23)
INSERT INTO A (STRING, DT, B, NUM) VALUES (NULL, '2012-03-16 16:39:04.893', 0, 23)
INSERT INTO A (STRING, DT, B, NUM) VALUES ('TEST', NULL, 0, 23)
INSERT INTO A (STRING, DT, B, NUM) VALUES ('TEST', '2012-03-16 16:39:04.893', NULL, 23)
INSERT INTO A (STRING, DT, B, NUM) VALUES ('TEST', '2012-03-16 16:39:04.893', 0, NULL)
INSERT INTO A (STRING, DT, B, NUM) VALUES ('TEST', '2012-03-16 16:39:04.893', 0, 23)
INSERT INTO A (STRING, DT, B, NUM) VALUES ('TEST', '2012-03-16 16:39:04.893', 0, 23)
INSERT INTO A (STRING, DT, B, NUM) VALUES ('TEST', '2012-03-16 16:39:04.893', 0, 23)
INSERT INTO A (STRING, DT, B, NUM) VALUES ('TEST', '2012-03-16 16:39:04.893', 0, 23)
INSERT INTO A (STRING, DT, B, NUM) VALUES ('TEST', '2012-03-16 16:39:04.893', 0, 23)
INSERT INTO B (STRING, DT, B, NUM) VALUES ('TEST', '2012-03-16 16:39:04.893', 0, 23)
INSERT INTO B (STRING, DT, B, NUM) VALUES ('TEST', '2012-03-16 16:39:04.893', 0, 23)
INSERT INTO B (STRING, DT, B, NUM) VALUES ('TEST', '2012-03-16 16:39:04.893', 0, 23)
INSERT INTO B (STRING, DT, B, NUM) VALUES ('TEST', '2012-03-16 16:39:04.893', 0, 23)
INSERT INTO B (STRING, DT, B, NUM) VALUES ('TEST', '2012-03-16 16:39:04.893', 0, 23)
INSERT INTO B (STRING, DT, B, NUM) VALUES ('STAGE', '2012-03-16 16:39:04.893', 0, 23)
INSERT INTO B (STRING, DT, B, NUM) VALUES ('TEST', '2555-11-11 00:00:00.000', 0, 23)
INSERT INTO B (STRING, DT, B, NUM) VALUES ('TEST', '2012-03-16 16:39:04.893', 0, 23)
INSERT INTO B (STRING, DT, B, NUM) VALUES ('TEST', '2012-03-16 16:39:04.893', 0, 23)
INSERT INTO B (STRING, DT, B, NUM) VALUES ('TEST', '2012-03-16 16:39:04.893', 0, 999)
sql-server
null
GWR
quelle
quelle
Standard-SQL, unterstützt in SQL Server 2005 und höher:
quelle
Dies ist ein globaler Ansatz, daher habe ich eine korrigierte Abfrage von question nicht neu geschrieben. Ich möchte nur einen nützlichen Punkt teilen, vielleicht hilft das folgende Skript, um zu prüfen, ob Spalte1 und Spalte2 gleich sind. Zusätzlich wird die Konvertierung in VARBINARY verwendet, um Vergleiche zwischen Groß- und Kleinschreibung durchzuführen, und Sie können sie gegebenenfalls entfernen.
Sie können das Ende des Ausdrucks auf ändern,
IS NOT NULL
um ungleiche Bedingungen zu überprüfen.Ich hoffe das hilft.
quelle