it-swarm.com.de

Kompatibles SQL zum Testen auf nicht leere und nicht leere Zeichenfolgen

Ich möchte kompatibles SQL für Oracle-Datenbank und Microsoft SQL-Server.

Ich möchte einen kompatiblen SQL-Ausdruck, der true für nicht null und keine leeren Zeichenfolgen zurückgibt.

Wenn ich benutze:

column <> ''

es funktioniert auf Microsoft SQL Server, aber nicht auf Oracle-Datenbanken (da '' für Oracle null ist)

Wenn ich benutze:

len(column) > 0

es funktioniert auf Microsoft SQL Server, aber nicht auf Oracle-Datenbanken (da length () verwendet wird)

22
Eduardo

NULLIF ist sowohl für Oracle ( doc ) als auch für SQL Server ( doc ) verfügbar. Dieser Ausdruck sollte funktionieren:

NULLIF(column, '') IS NOT NULL

Wenn auf beiden Servern columnNULL ist, wird die Ausgabe von NULLIF den Wert NULL einfach durchlassen. Auf SQL Server ist '' = '' die Ausgabe von NULLIFNULL. Unter Oracle ist '' bereits NULL, daher wird es weitergeleitet.

Dies ist mein Test für SQL Server 2008 R2 Express:

WITH SampleData AS
    (SELECT 1 AS col1, NULL AS col2
     UNION ALL
     SELECT 2, ''
     UNION ALL
     SELECT 3, 'hello')
SELECT *
  FROM SampleData
 WHERE NULLIF(col2, '') IS NOT NULL;

Und dies ist mein Testfall für Oracle 10g XE:

WITH SampleData AS
    (SELECT 1 AS col1, NULL AS col2 FROM DUAL
     UNION ALL
     SELECT 2, '' FROM DUAL
     UNION ALL
     SELECT 3, 'hello' FROM DUAL)
SELECT *
  FROM SampleData
 WHERE NULLIF(col2, '') IS NOT NULL;

Beide geben 3 wie erwartet zurück.

39

Wie wäre es mit

CASE WHEN column = '' THEN NULL ELSE column END IS NOT NULL
8
Gary Myers

Ich denke, der Schlüssel hier ist, zwischen dem Fall zu unterscheiden, in dem die leere Zeichenfolge NULL entspricht und wenn dies nicht der Fall ist:

WHERE CASE WHEN '' = '' THEN -- e.g., SQL Server this is true
              CASE WHEN col <> '' AND col IS NOT NULL THEN 'Y'
                   ELSE 'N'
              END
           WHEN COALESCE(col,NULL) IS NOT NULL THEN 'Y' -- Not SS, e.g., Oracle
           ELSE 'N'
      END = 'Y';

Wenn der erste Fall wahr ist, ist die leere Zeichenfolge nicht gleich null, und wir müssen prüfen, ob sowohl die Zeichenfolge nicht null ist als auch die leere Zeichenfolge nicht. Andernfalls ist unsere Aufgabe einfacher, da leere Zeichenfolge und Null gleich sind.

1
DCookie

Ein Versuch, @ DCookies Antwort zu verkürzen. Ich mag seinen ( '' = '' ) Test.

CASE WHEN ( '' = '' ) THEN ( column <> '' )
                      ELSE ( column = column )
END

Leider funktioniert das oben nicht. Der nächste arbeitet in SQL-Server. Ich kann jetzt nicht in Oracle testen:

CASE WHEN  '' = ''  THEN CASE WHEN column <> ''    THEN 1 ELSE NULL END 
                    ELSE CASE WHEN column = column THEN 1 ELSE NULL END 
END

was auch geschrieben werden kann als:

    ( '' = ''    AND column <> '' )
 OR ( '' IS NULL AND column = column ) 
0
ypercubeᵀᴹ