Prüfen auf NULL oder leere Zeichenkette

Themen rund um den praktischen Einsatz von Firebird. Fragen zu SQL, Performance, Datenbankstrukturen, etc.

Moderator: thorben.braun

Benutzeravatar
martin.koeditz
Beiträge: 446
Registriert: Sa 31. Mär 2018, 14:35

Guten Morgen,

häufig habe ich den Fall, dass ich auf einen NULL-Wert oder eine leere Zeichenkette prüfe. Etwa so:

Code: Alles auswählen

IF(VORNAME IS NULL OR VORNAME = '') THEN ...
Gibt es hierfür auch eine kürzere Schreibweise?

Dank und Gruß
Martin
Martin Köditz
it & synergy GmbH
bfuerchau
Beiträge: 490
Registriert: Mo 7. Mai 2018, 18:09
Kontaktdaten:

Coalesce(feld, '') = ''
Benutzeravatar
martin.koeditz
Beiträge: 446
Registriert: Sa 31. Mär 2018, 14:35

Ist nicht dein Ernst... :lol:

Danke dir.
Martin Köditz
it & synergy GmbH
bfuerchau
Beiträge: 490
Registriert: Mo 7. Mai 2018, 18:09
Kontaktdaten:

Das Leben kann manchmal so einfach sein.
Wie verhinderst du eine Division durch 0?

wert1 / Nullif(wert, 0)
Benutzeravatar
martin.koeditz
Beiträge: 446
Registriert: Sa 31. Mär 2018, 14:35

Der ist auch gut. Danke.
Martin Köditz
it & synergy GmbH
jhoehne
Beiträge: 40
Registriert: Di 11. Dez 2018, 09:19

bfuerchau hat geschrieben: Mi 6. Mär 2024, 09:15 Coalesce(feld, '') = ''
Ich mache gerne auch noch ein Trim() drumrum, für den Fall, dass jemand ein paar Leerzeichen ins Feld geschrieben, oder beim "Löschen" dort einige vergessen hat.
--
Joachim
bfuerchau
Beiträge: 490
Registriert: Mo 7. Mai 2018, 18:09
Kontaktdaten:

Der ist unnötig, da ein SQL-Zeichenvergleich die Anzahl Leerzeichen am Ende nicht berücksichtigt.
Außerdem hat ein CHAR-Feld immer Leerzeichen außer bei NULL.
Das war schon so, als SQL in den 70ern des letzten Jahrhunderts erfunden wurde.
Ursache war den Sprachen COBOL und RPG, in denen dasselbe gilt.
Anders siehts halt in den modernen Sprachen aus wie C/C++/C#/Java u.v.m.
Da gillt eher der binäre, ggf. noch case insensitive Vergleich, der Leerzeichen einschließt.
Verwendest du aber ein .Net DataTable-Objekt oder Resultsets aus SQL-Quellen, so gelten hier Filter wieder mit Auto-RTtrim.
Benutzeravatar
martin.koeditz
Beiträge: 446
Registriert: Sa 31. Mär 2018, 14:35

Ich mache gerne auch noch ein Trim() drumrum, für den Fall, dass jemand ein paar Leerzeichen ins Feld geschrieben, oder beim "Löschen" dort einige vergessen hat.
Habe ich auch immer so gemacht.
Der ist unnötig, da ein SQL-Zeichenvergleich die Anzahl Leerzeichen am Ende nicht berücksichtigt.
Funktioniert wirklich. Gerade getestet.
Martin Köditz
it & synergy GmbH
bfuerchau
Beiträge: 490
Registriert: Mo 7. Mai 2018, 18:09
Kontaktdaten:

Das hat mitunter auch den Vorteil, dass für diese Abfragen dann Indizes verwendet werden können.
Abfragen mit Funktionen können keinen Index verwenden außer, wenn du einen calculated Index erstellst, der dann genau dem Abfrageausdruck entspricht.

Wenn du z.B. mit Java oder .Net eine Abfrage via Commandobjekt und Parametern gestaltest verwendest du ja bei Strings i.d.R. auch nur den tatsächlichen Inhalt.
In der DB ist es daher egal, ob du ein CHAR(nn) oder ein VARCHAR(nn) abfragst. Oder hast du dir schon mal Gedanken gemacht, den Abfragewert mit passenden Leerzeichen aufzufüllen?

Und was deinen Test angeht wollte von Jahren mir ein DB-Spezi das Gegenteil beweisen:
Definiere ein Feld mit CHAR(1) und schreibe einen Satz mit "A".
Frage nun mit "A" oder "A " ab.
Was meinst du, welches Ergebnis dabei rauskam. :geek:
jhoehne
Beiträge: 40
Registriert: Di 11. Dez 2018, 09:19

In der Firebird-Doku steht: CHAR(n) wird hinten mit Leerzeichen aufgefüllt. Ich habs getestet, isso:

Code: Alles auswählen

CREATE TABLE blubb
(
  feld1 CHAR(50),
  feld2 VARCHAR(50)
);

INSERT INTO blubb (feld1, feld2) VALUES ('', '');

SELECT CHAR_LENGTH(feld1), CHAR_LENGTH(feld2) FROM blubb;
ergibt 50 und 0.

Aber:

Code: Alles auswählen

SELECT feld1 = '', feld2 = '' FROM blubb;
ergibt TRUE und TRUE

P.S.: in Textprogrammen kann man mit gedrückter Alt-Taste und der Ziffernfolge 0 1 6 0 auf dem Zehnerblock ein sogenanntes unsichtbares Leerzeichen erzeugen. Mit dem in "feld1" ergibt die letzte Abfrage "FALSE", obwohl der Text nicht von einem Leerstring zu unterscheiden ist. :D
--
Joachim
Antworten