2 Stimmen

SET ANSI_NULL Behavior SET ANSI_NULL Verhalten

SET ANSI_NULLS ON;
-- Abfrage1
SELECT 'StackOverFlow' AS Statement11
WHERE 'Name' IN ('S','Q', 'L', 'Name', NULL);
-- Abfrage 2
SELECT 'StackOverFlow' AS Statement12
WHERE 'Name' NOT IN ('S','Q', 'L', NULL);

Warum gibt Abfrage 1 Ergebnisse zurück, aber Abfrage 2 liefert keine Ergebnisse?

3voto

Adriaan Stander Punkte 155899

Aus SET ANSI_NULLS (Transact-SQL)

Wenn SET ANSI_NULLS aktiviert ist, gibt eine SELECT-Anweisung, die WHERE column_name = NULL verwendet, auch dann null Zeilen zurück, wenn column_name Nullwerte enthält. Eine SELECT-Anweisung, die WHERE column_name <> NULL verwendet, gibt auch dann null Zeilen zurück, wenn column_name Nicht-NULL-Werte enthält.

Jetzt, wenn Sie verwenden würden

SET ANSI_NULLS OFF;
-- Abfrage 1
SELECT 'StackOverFlow' AS Statement11
WHERE 'Name' IN ('S','Q', 'L', 'Authority', NULL);
-- Abfrage 2
SELECT 'StackOverFlow' AS Statement12
WHERE 'Name' NOT IN ('S','Q', 'L', NULL);

Die zweite Abfrage würde ein Ergebnis zurückgeben.

SQL Fiddle DEMO

Wenn SET ANSI_NULLS aktiviert ist, evaluieren alle Vergleiche gegen einen Nullwert zu UNKNOWN. Wenn SET ANSI_NULLS deaktiviert ist, evaluieren Vergleiche aller Daten gegen einen Nullwert zu TRUE, wenn der Datenwert NULL ist.

EDIT

Wie von @Damien_The_Unveliever erwähnt

von IN (Transact-SQL)

Alle durch eine Unterabfrage oder Ausdruck zurückgegebenen Nullwerte, die mit test_expression unter Verwendung von IN oder NOT IN verglichen werden, geben UNKNOWN zurück. Die Verwendung von Nullwerten zusammen mit IN oder NOT IN kann zu unerwarteten Ergebnissen führen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X