Ich weiß, dass mehrere Parameter übergeben werden können COALESCE
, aber wenn Sie nur einen Ausdruck überprüfen möchten, um festzustellen, ob er nicht vorhanden ist, verwenden Sie einen Standard oder ist es besser, ihn ISNULL
stattdessen zu verwenden ?
Gibt es einen Leistungsgewinn zwischen den beiden?
ISNULL
wird auch das Ergebnis auf den Datentyp des ersten Ausdrucks zwingen, wie hier dargestelltAntworten:
Dieses in Microsoft Connect gemeldete Problem zeigt einige Unterschiede zwischen
COALESCE
undISNULL
:quelle
Ich denke nicht, aber COALESCE ist im SQL '92 -Standard und wird von verschiedenen Datenbanken unterstützt. Wenn Sie sich für Portabilität entscheiden, verwenden Sie ISNULL nicht.
quelle
ifnull
SQL Serverisnull
.In COALESCE können Sie mehrere Ausdrücke haben, wobei Sie wie in ISNULL nur einen Ausdruck überprüfen können
quelle
Erwähnenswert ist, dass die Typbehandlung zwischen den beiden ebenfalls einen Unterschied machen kann (siehe diesen zugehörigen Antwortpunkt (2) ).
Angenommen, eine Abfrage versucht, eine Verknüpfung zum Schreiben eines Nullvergleichs zu verwenden:
select * from SomeTable where IsNull(SomeNullableBitField, -1) != IsNull(SomeOtherNullableBitField, -1);
das ist anders als
select * from SomeTable where coalesce(SomeNullableBitField, -1) != coalesce(SomeOtherNullableBitField, -1);
Denn im ersten Fall erzwingt IsNull (), dass der Typ ein Bit ist (also wird -1 in true konvertiert), während im zweiten Fall beide zu einem int heraufgestuft werden.
with input as ( select convert(bit, 1) as BitOn, convert(bit, 0) as BitOff, convert(bit, null) as BitNull ) select BitOn, BitOff, BitNull, IsNull(BitOn, -1) IsNullBitOn, -- true IsNull(BitOff, -1) IsNullBitOff, -- false IsNull(BitNull, -1) IsNullBitNull, -- true, converts the -1 to bit coalesce(BitOn, -1) CoalesceBitOn, -- 1 coalesce(BitOff, -1) CoalesceBitOff, -- 0 coalesce(BitNull, -1) CoalesceBitNull -- -1 from input;
Es gibt einen ähnlichen Kommentar / Link (@Martin Smith) zu der Frage selbst.
quelle
Eine wichtige Sache, die ich nicht explizit angegeben sehe, ist, dass
ISNULL
der Ausgabetyp dem ersten Ausdruck ähnlich ist, aberCOALESCE
damit den Datentyp des Werts mit der höchsten Priorität zurückgibt.DECLARE @X VARCHAR(3) = NULL DECLARE @Y VARCHAR(10) = '123456789' /* The datatype returned is similar to X, or the first expression*/ SELECT ISNULL(@X, @Y) ---> Output is '123' /* The datatype returned is similar to Y, or to the value of highest precedence*/ SELECT COALESCE(@X, @Y) ---> Output is '123456789'
quelle
ISNULL uses the data type of the first parameter, COALESCE follows the CASE expression rules and returns the data type of value with the highest precedence.
Die
NULL
undCOALESCE
sind nicht immer austauschbar. Es verdient, ihre Unterschiede zu kennen, um zu wissen, wann es besser ist, das eine über das andere zu verwenden:Die obige Tabelle ist ein Vergleich zwischen
ISNULL
undCOALESCE
aus einemExam Ref 70-761 Querying Data with Transact-SQL
Buch von Itzik Ben-Gan.2
fürISNULL
vs>2
bei VerwendungCOALESCE
ISNULL
ist eine proprietäre T-SQL-Funktion und entspricht demCOALESCE
ISO / ANSI-SQL-StandardDer Datentyp des Ergebnisses ist wichtig. Überprüfen Sie nach dem Lesen der Notizen in der obigen Tabelle die folgenden Fälle:
DECLARE @x VARCHAR(3) = NULL ,@y VARCHAR(10) = '1234567890'; SELECT ISNULL(@x, @y) AS [ISNULL], COALESCE(@x, @y) AS [COALESCE];
Das
ISNULL
erhält den Datentyp des ersten Arguments, da es nichtNULL
wörtlich ist. Es istVARCHAR(3)
und ist ein Ergebnis, die Daten des zweiten Arguments werden entsprechend zugeschnitten. MitCOALESCE
dem Datentyp, wenn höchste Priorität verwendet wird.DECLARE @x VARCHAR(8) = '123x5' ,@y INT = 123; SELECT ISNULL(@x, @y) AS [ISNULL]; SELECT COALESCE(@x, @y) AS [COALESCE];
Das
ISNULL
gibt den Datentyp des ersten Arguments zurück, während inCOALESCE
wir Fehler erhalten, da dasINT
den höchsten Vorrang hat und die Konvertierung des ersten Argumentwerts inINT
fehlschlägt.Die Nullbarkeit des Ergebnisses kann ebenfalls wichtig sein. Zum Beispiel:
DECLARE @x VARCHAR(3) = NULL ,@y VARCHAR(3) = NULL; DROP TABLE IF EXISTS [dbo].[DataSource01]; SELECT ISNULL(10, 20) AS [C1] ,ISNULL(@x, 'text') AS [C2] ,ISNULL(@x, @y) AS [C3] INTO [dbo].[DataSource01]; DROP TABLE IF EXISTS [dbo].[DataSource02]; SELECT COALESCE(10, 20) AS [C1] ,COALESCE(@x, 'text') AS [C2] ,COALESCE(@x, @y) AS [C3] INTO [dbo].[DataSource02];
Lassen Sie uns die
Nullable
Eigenschaft jeder Spalte überprüfen :Mit haben
COALESCE
wir eineNOT NULL
Eigenschaft der Spalte auf gesetztYes
, nur wenn alle Eingaben nicht nullfähig sind.Gemäß dem SQL-Standard wird der
COALESCE
Ausdruck übersetzt in:CASE WHEN (<subquery>) IS NOT NULL THEN (<subquery>) ELSE 0 END
quelle
Wenn es nur eine Nullbedingung gibt,
ISNULL
hat dies weniger Overhead. Der Unterschied ist jedoch wahrscheinlich vernachlässigbar.quelle
ISNULL
?COALESCE
denen bei austauschbarer Verwendung mehr Overhead entsteht. ZunächstISNULL
befasst sich mit einer festgelegten Zahl von Eingängen, wobeiCOALESCE
mit einer beliebigen Anzahl von Eingängen mit der Arbeit bestimmt wird. ZweitensCOALESCE
ist konfiguriert, um den Datentyp des Ausdrucks mit der höchsten Priorität für den Datentyp zurückzugeben, währendISNULL
derselbe Typ wie der zurückgegeben wirdcheck_expression
. Wie oben erwähnt, ist der Unterschied in späteren Versionen von SQL Server wahrscheinlich vernachlässigbar, aber genau genommen gibt es immer noch Overhead.Diese Erklärung gibt deutlich über Koaleszenz gegen Isnull
Die COALESCE-Funktion in SQL gibt den ersten Nicht-NULL-Ausdruck unter ihren Argumenten zurück. Die Syntax für COALESCE lautet wie folgt:
Dies entspricht der folgenden CASE-Anweisung:
SELECT CASE ("column_name") WHEN "expression 1 is not NULL" THEN "expression 1" WHEN "expression 2 is not NULL" THEN "expression 2" ... [ELSE "NULL"] END FROM "table_name";
In SQL Server wird die Funktion ISNULL () verwendet, um den NULL-Wert durch einen anderen Wert zu ersetzen.
select CountryName = ISNULL("columnname", 'INDIA') from Countries
Coalesce gibt den ersten Nicht-Null-Ausdruck zurück, wobei asnull () verwendet wird, um den Nullwert durch unseren gewünschten Wert zu ersetzen.
COALESCE ist Teil der ANSI-Standards und in fast allen Datenbanken verfügbar.
Bei der Entscheidung zwischen ISNULL und COALESCE müssen die folgenden Parameter berücksichtigt werden:
Betrachten Sie die folgenden SQL-Anweisungen
DECLARE @c5 VARCHAR(5); SELECT 'COALESCE', COALESCE(@c5, 'longer name') UNION ALL SELECT 'ISNULL', ISNULL(@c5, 'longer name');
Ergebnisse:
Dies liegt daran, dass ISNULL den Datentyp des ersten Arguments verwendet, während COALESCE alle Elemente überprüft und die beste Anpassung auswählt (in diesem Fall VARCHAR (11)).
Weitere Informationen zur Entscheidung zwischen COALESCE und ISNULL finden Sie unter: https://www.mssqltips.com/sqlservertip/2689/deciding-between-coalesce-and-isnull-in-sql-server/
quelle
In COALESCE kann man mehrere Ausdrücke verwenden. Es wird ein Wert zurückgegeben, der keine Null ist und zuerst auftritt ... zum Beispiel
DECLARE @Value1 INT, @Value2 INT, @Value3 INT, @Value4 INT SELECT @Value2 = 2, @Value4 = 4 SELECT COALESCE(@Value1, @Value2, @Value3, @Value4) SELECT COALESCE(@Value1, @Value4, @Value3, @Value2)
Und in ISNULL gibt der Ausdruck null den zweiten angegebenen Parameter zurück, und Sie können natürlich nur nach einem Ausdruck suchen ...
Wenn Sie also mehrere Ausdrücke überprüfen und zuerst nicht null unter ihnen auswählen möchten, verwenden Sie coalesce, andernfalls wählen Sie ISNULL
quelle