AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Im Select null oder Wert in WHERE

Im Select null oder Wert in WHERE

Ein Thema von Kostas · begonnen am 26. Jan 2020 · letzter Beitrag vom 27. Jan 2020
Antwort Antwort
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.378 Beiträge
 
Delphi 12 Athens
 
#1

AW: Im Select null oder Wert in WHERE

  Alt 26. Jan 2020, 21:59
Nja, sauber oder nicht, das ist so eine Sache ... irgendwas mit NULL ergibt halt NULL, außer beim OR.
Und das ist eigentlich in allen Datenbanksprachen einheitlich so.

Drum gibt es ja so Dinge wie COALESCE, CONCAT (statt dem || ), NULLIF, IS DISTINCT FROM, IS NOT DISTINCT FROM usw.

z.B. IS [NOT] DISTINCT FROM heißt im Postgres so, aber gibt gibt es auch in anderen Sprachen (auch wenn es dort vielleicht anders heißt).
Es vergleicht beide Seiten auf Identisch, und kann auch mit NULL vergleichen, ohne dass dabei NULL raus kommt.
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu (26. Jan 2020 um 22:02 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.378 Beiträge
 
Delphi 12 Athens
 
#2

AW: Im Select null oder Wert in WHERE

  Alt 26. Jan 2020, 22:10
In so manchem DBMS kann man Operatoren auch selbst definieren.
Dort könnteste du dir dann auch einen "kurzen" Operator für Vergleiche mit NULL und EMPTY selbst bauen, wenn/da es sowas oft nicht "vernünftig" gibt,
denn mal ganz im Ernst, aber wer sich IS NOT DISTINCT FROM ausgedacht hat ... k.A. was der da geraucht hatte.

SQL-Code:
CREATE OR REPLACE FUNCTION compare_with_null(value_a anyelement, value_b anyelement) RETURNS boolean AS $$
  SELECT nullif(value_a, '') = nullif(value_b, '')
  $$ LANGUAGE SQL IMMUTABLE;

CREATE OPERATOR ~= (LEFTARG=anyelement, RIGHTARG=anyelement, PROCEDURE=compare_with_null);


SELECT ADRESSID
FROM ADRESSEN
WHERE VORNAME = :VORNAME
  AND NACHNAME = :NACHNAME
  AND STRASSE ~= :STRASSE
  AND PLZ ~= :PLZ
  AND ORT ~= :ORT
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu (26. Jan 2020 um 22:19 Uhr)
  Mit Zitat antworten Zitat
Kostas

Registriert seit: 14. Mai 2003
Ort: Gerstrhofen
1.112 Beiträge
 
Delphi 12 Athens
 
#3

AW: Im Select null oder Wert in WHERE

  Alt 26. Jan 2020, 22:16
... IS NOT DISTINCT FROM ausgedacht hat ... k.A. was der da geraucht hatte.


ja, da gibt es einiges. so bleibt es nicht langweilig.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.378 Beiträge
 
Delphi 12 Athens
 
#4

AW: Im Select null oder Wert in WHERE

  Alt 26. Jan 2020, 22:23
In meinen Fall funktioniert das nicht wenn ich auch nach einem NULL prüfen muss
Jupp, drum die COALESCE bzw. NULLIF, um das NULL mit zu behandeln,
z.B. siehe die Varianten nach dem letzten "oder".
Das Erste davon mit NULL im Delphi abgefangen und das Letzte davon im SQL behandelt.
Delphi-Quellcode:
// im Delphi
if quelle.Strasse=''
then ParamByName('strasse').Clear //ParamByName('strasse').AsValue = Null
else ParamByName('strasse').AsString = quelle.Strasse;
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu (26. Jan 2020 um 22:27 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#5

AW: Im Select null oder Wert in WHERE

  Alt 26. Jan 2020, 23:38
Es ist schon ungewöhnlich, wenn ein Textfeld wie "Strasse" mit NULL initialisiert wird, da Wert nicht vorhanden recht gut mit einem Leerstring widergegeben werden kann. Anders ist es bei numerischen oder Datumswerten da wird ein NULL hierfür benötigt.

Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.876 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: Im Select null oder Wert in WHERE

  Alt 27. Jan 2020, 08:10
Zitat:
ja das ist voll Krank nur weil das SQL damals nicht sauber umgesetzt wurde.
Warum wurde der Vergleich auf NULL anders behandelt als der Vergleich mit einem Wert
Weil NULL kein Wert ist.
Markus Kinzler
  Mit Zitat antworten Zitat
Kostas

Registriert seit: 14. Mai 2003
Ort: Gerstrhofen
1.112 Beiträge
 
Delphi 12 Athens
 
#7

AW: Im Select null oder Wert in WHERE

  Alt 27. Jan 2020, 08:59
Zitat:
ja das ist voll Krank nur weil das SQL damals nicht sauber umgesetzt wurde.
Warum wurde der Vergleich auf NULL anders behandelt als der Vergleich mit einem Wert
Weil NULL kein Wert ist.
ist schon klar, ich kritisiere hier NUR den unterschied zwischen abfrage geben null und abfrage gegen Wert.
Adresse = 'XY'
Adresse = null
Adresse is null warum wurde hier "is" und nicht "=" implementiert. Also Adresse = null. Damit hätte man nur ein Variante des Vergleichs.

Durch die Fallunterscheidung muss man daran denken dass auch gegen null verglichen werden könnten und müsste das SQL anpassen wie auch vom himitsu vorgeschlagen
z.B.: ((STRASSE IS NULL AND :STRASSE IS NULL) OR (STRASSE = :STRASSE)) oder über Macros das SQL dynamisch aufbauen.
Ist meiner Meinung nach völlig unnötig.

Denn wenn man nicht daran denkt, funktioniert der Vergleich nicht!

Code:
SELECT ADRESSID
FROM ADRESSEN
WHERE VORNAME = :VORNAME
  AND NACHNAME = :NACHNAME
  AND STRASSE = :STRASSE
  AND PLZ = :PLZ
  AND ORT = :ORT


if mdQuelle.FieldByName('STRASSE').IsNull
then qrZiel.ParamByName('STRASSE').Clear
else qrZiel.ParamByName('STRASSE').AsString := mdQuelle.FieldByName('STRASSE').AsString;



Gruß Kostas
  Mit Zitat antworten Zitat
Kostas

Registriert seit: 14. Mai 2003
Ort: Gerstrhofen
1.112 Beiträge
 
Delphi 12 Athens
 
#8

AW: Im Select null oder Wert in WHERE

  Alt 27. Jan 2020, 09:24
Es ist schon ungewöhnlich, wenn ein Textfeld wie "Strasse" mit NULL initialisiert wird, da Wert nicht vorhanden recht gut mit einem Leerstring widergegeben werden kann. Anders ist es bei numerischen oder Datumswerten da wird ein NULL hierfür benötigt.

Gruß
K-H
Hallo K-H,

ich bekommen eine DB mit mehreren tausend Adressen. Einige Felder davon sind nullable und sind auch leer. Ich würde die Strings übrigens auch auf null lassen und nicht mit einem leer String befüllen, einfach nur weil ich es als richtiger empfinde. Aber wie du schon gelesen hast, kritisiere ich NUR die Umsetzung mit dem Unterschied der Abfrage mit "=" für Werte und die Abfrage mit "is" für null. Das finde ich völlig unnötig und eine große Fehlerquelle.

Gruß Kostas
  Mit Zitat antworten Zitat
Jumpy

Registriert seit: 9. Dez 2010
Ort: Mönchengladbach
1.740 Beiträge
 
Delphi 6 Enterprise
 
#9

AW: Im Select null oder Wert in WHERE

  Alt 27. Jan 2020, 10:16
Es lassen sich bestimmt bessere Erklärungen für das "Warum" finden, aber das war auf die Schnelle:

https://stackoverflow.com/questions/...ead-of-is-null
Ralph
  Mit Zitat antworten Zitat
Kostas

Registriert seit: 14. Mai 2003
Ort: Gerstrhofen
1.112 Beiträge
 
Delphi 12 Athens
 
#10

AW: Im Select null oder Wert in WHERE

  Alt 26. Jan 2020, 22:14
SQL gibt es ja schon sehr lange. Warum bestimmte Sachen nicht verbessert werden ist schon komisch.

In meinen Fall funktioniert das nicht wenn ich auch nach einem NULL prüfen muss :
Code:
AND (STRASSE = :STRASSE)
und ich muss es so schreiben:
Code:
AND ((STRASSE IS NULL AND :STRASSE IS NULL) OR (STRASSE = :STRASSE))
  Mit Zitat antworten Zitat
Antwort Antwort

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:39 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz