Wie kann am besten überprüft werden, ob der Wert in Postgres-SQL-Anweisungen null oder eine leere Zeichenfolge ist?
Der Wert kann ein langer Ausdruck sein, daher ist es vorzuziehen, dass er nur einmal in der Prüfung geschrieben wird.
Derzeit verwende ich:
coalesce( trim(stringexpression),'')=''
Aber es sieht ein bisschen hässlich aus.
stringexpression
kann eine char(n)
Spalte oder ein Ausdruck sein, der char(n)
Spalten mit nachgestellten Leerzeichen enthält.
Was ist der beste Weg?
char
ist aufgrund der Polsterung (und der daraus resultierenden Platzverschwendung) fast immer die falsche Wahl. Aber abgesehen davon: Ich glaube nicht, dass es eine bessere Lösung gibt.Antworten:
Der Ausdruck
stringexpression = ''
ergibt:TRUE
.. für''
(oder für jede Zeichenfolge, die nur aus Leerzeichen mit dem Datentyp bestehtchar(n)
)NULL
.. fürNULL
FALSE
.. für alles andereSo überprüfen Sie: "
stringexpression
ist entweder NULL oder leer" :Oder der umgekehrte Ansatz (möglicherweise leichter zu lesen):
Funktioniert für jeden Zeichentyp einschließlich
char(n)
. Das Handbuch zu Vergleichsoperatoren.Oder verwenden Sie Ihren ursprünglichen Ausdruck ohne
trim()
, was fürchar(n)
(siehe unten) kostspielig oder für andere Zeichentypen falsch ist: Zeichenfolgen, die nur aus Leerzeichen bestehen, werden als leere Zeichenfolge übergeben.Die Ausdrücke oben sind jedoch schneller.
Das Gegenteil zu behaupten ist noch einfacher: "
stringexpression
ist weder NULL noch leer" :Über
char(n)
Hier geht es um den Datentyp
char(n)
, kurz für :character(n)
. (char
/character
stehen fürchar(1)
/character(1)
.) Von seiner Verwendung wird in Postgres abgeraten :Nicht zu verwechseln
char(n)
mit anderen, nützlich, Charaktertypenvarchar(n)
,varchar
,text
oder"char"
(mit Anführungszeichen).In
char(n)
einer leeren Zeichenfolge ist nicht anders als jede andere Zeichenfolge , die nur aus Leerzeichen. Alle diese sind gemäß Definition des Typs auf n Leerzeichen gefaltetchar(n)
. Daraus folgt logischerweise, dass die obigen Ausdrücke auch funktionierenchar(n)
- genauso wie diese (was für andere Zeichentypen nicht funktionieren würde):Demo
Eine leere Zeichenfolge entspricht einer beliebigen Zeichenfolge von Leerzeichen, wenn sie in Folgendes umgewandelt wird
char(n)
:Ergebnis:
Test auf "null oder leere Zeichenfolge" mit
char(n)
:Ergebnis:
Test auf "null oder leere Zeichenfolge" mit
text
:Ergebnis:
db <> hier fummeln
Alte sqlfiddle
Verbunden:
quelle
best way to check if value is null or empty string
. Dertrim()
Anruf ist (vergleichsweise) teuer - und einfach nicht notwendig. Ich habe mehr überchar(n)
und "leere Zeichenfolge" hinzugefügt .''
. Kann ich die Verkleidung entfernen undcoalesce(stringexpression,'')=''
zur Überprüfung verwenden ? Dies erscheint mir im Vergleich zu Ihrer Antwort besser lesbar.select coalesce(' ', '') = ''
gibt false zurück. Also ist TRIM () erforderlichcoalesce(' '::char(5), '') = ''
nicht. Ich würde auf jeden Fall einen der beiden obersten Ausdrücke verwenden, die für jeden Zeichentyp funktionieren und am schnellsten und saubersten sind.So prüfen Sie, ob null und leer sind:
Um nach Nullen, Leerzeichen und Leerzeichen zu suchen (schneiden Sie die Zeichenfolge ab)
quelle
Das Überprüfen der Länge der Zeichenfolge funktioniert ebenfalls und ist kompakt:
quelle
where length(stringexpression) = 0;
. Das funktioniert bei mir.Wenn möglicherweise leere Leerzeichen vorhanden sind, gibt es wahrscheinlich keine bessere Lösung.
COALESCE
ist nur für Probleme wie deine.quelle
Etwas, das ich gesehen habe, ist
stringexpression > ''
. Dies ist vielleicht nicht die schnellste, aber zufällig eine der kürzesten.Versuchte es sowohl auf MS SQL als auch auf PostgreSQL.
quelle
Ein anderer Weg ist
quelle
Meine bevorzugte Methode zum Vergleichen von nullbaren Feldern ist: NULLIF (nullablefield ,: ParameterValue) IST NULL UND NULLIF (: ParameterValue, nullablefield) IST NULL. Dies ist umständlich, aber von universellem Nutzen, während Coalesce in einigen Fällen unmöglich ist.
Die zweite und umgekehrte Verwendung von NULLIF ist, weil "NULLIF (nullablefield ,: ParameterValue) IS NULL" immer "true" zurückgibt, wenn der erste Parameter null ist.
quelle
Wenn eine Datenbank mit einer großen Anzahl von Datensätzen
null check
länger dauern kann, können Sie die Nullprüfung auf verschiedene Arten verwenden, z. B.: 1)where columnname is null
2)where not exists()
3)WHERE (case when columnname is null then true end)
quelle
Viele der Antworten sind der kürzeste Weg, nicht unbedingt der beste, wenn die Spalte viele Nullen enthält. Durch das Aufbrechen der Überprüfungen kann der Optimierer die Überprüfung schneller auswerten, da er nicht an der anderen Bedingung arbeiten muss.
Der Zeichenfolgenvergleich muss nicht ausgewertet werden, da die erste Bedingung falsch ist.
quelle