NULL durchlaufen

Viele Menschen kennen und verwenden die integrierte Funktion ISNULL (X, Y), die das erste Argument durch das zweite ersetzt, wenn es (first) NULL ist. Weniger häufig wird die inverse integrierte Funktion NULLIF (X, Y) verwendet, die NULL zurückgibt, wenn das erste Argument dem zweiten entspricht. Die Kombination dieser beiden Funktionen vermeidet die Verwendung von IF-ELSE- oder CASE-WHEN-Konstrukten, wodurch der Code kompakter wird. Wenn Sie sich für einige Beispiele interessieren, sind Sie bei cat willkommen.

Hier ist beispielsweise ein Code, der 10 zufällige Ganzzahlen im Bereich von 1 bis 37 ausgibt, und der nächste Wert, der gleich oder größer als die angezeigte Zahl ist, ist ein Vielfaches von 6.

SELECT Q.Src, CASE WHEN Q.Src % 6 = 0 THEN Q.Src ELSE Q.Src + (6 - Q.Src % 6) END AS NextTimes6 FROM ( SELECT TOP 10 CONVERT(INT, 1 + 37 * RAND(CHECKSUM(NEWID()))) Src FROM SYSOBJECTS S ) Q 

Sie können CASE..WHEN loswerden, indem Sie den folgenden Trick ausführen: Drehen Sie das Ergebnis des Ausdrucks Q.Src% 6 auf NULL, wenn der Rest 0 ist, und wissen Sie, dass das Ergebnis einer Operation mit NULL NULL ist. Stellen Sie dann NULL mit einer externen Funktion auf 0 zurück ISNULL:

 SELECT Q.Src, Q.Src + ISNULL(6 - NULLIF(Q.Src % 6, 0), 0) AS NextTimes6 FROM ( SELECT TOP 10 CONVERT(INT, 1 + 37 * RAND(CHECKSUM(NEWID()))) Src FROM SYSOBJECTS S ) Q 

Ein anderes Beispiel ist das Teilen einer Zeichenfolge in zwei Teile durch ein Leerzeichen (z. B. ein Name aus einer Zeichenfolge Name <Leerzeichen> Nachname. Ein typisches Problem beim Lösen von "frontal" ist die Absturzfunktion LEFT, wenn ein Argument von -1 als Wert für die Anzahl der zu schneidenden Zeichen übergeben wird wenn in der Quellzeile kein Leerzeichen vorhanden ist (CHARINDEX gibt 0 zurück):

 SELECT Q.Src, CASE WHEN CHARINDEX(' ', Q.Src) > 0 THEN LEFT(Q.Src, CHARINDEX(' ', Q.Src) - 1) ELSE Q.Src END AS NameOnly FROM ( SELECT N' ' AS Src UNION ALL SELECT N'' ) Q 

Wird zu:

 SELECT Q.Src, LEFT(Q.Src, ISNULL(NULLIF(CHARINDEX(' ', Q.Src), 0) - 1, LEN(Q.Src))) AS NameOnly FROM ( SELECT N' ' AS Src UNION ALL SELECT N'' ) Q 

Viel Spaß beim SQL-Programmieren!

Source: https://habr.com/ru/post/de413747/


All Articles