AGB  ·  Datenschutz  ·  Impressum  







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

Im Select null oder Wert in WHERE

Ein Thema von Kostas · begonnen am 26. Jan 2020 · letzter Beitrag vom 27. Jan 2020
Antwort Antwort
Seite 1 von 2  1 2      
Kostas

Registriert seit: 14. Mai 2003
Ort: Gerstrhofen
1.099 Beiträge
 
Delphi 10 Seattle Enterprise
 
#1

Im Select null oder Wert in WHERE

  Alt 26. Jan 2020, 21:45
Datenbank: Firebird • Version: 3.0 • Zugriff über: FIREDAC
Hallo Zusammen,

ich importiere Adressen in einer Tabelle. Jetzt kann es vorkommen dass die Felder Strasse, PLZ und Ort leer sind also wird in der Tabelle NULL geschrieben wird.
Beim importieren kann die erste Adresse keine Strasse haben die zwei keine PLZ die dritte komplett ohne Adresse. Sie darf natürlich nur einmal importiert werden.
Also muss ich jedes Feld dynamisch gegen ein Wert oder gegen Null prüfen. Eine Möglichkeit ist über Macros zu arbeiten.

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

Dieses Statement müsse sich jetzt dynamisch z.B.: über Macros ändern z.B.:
SELECT ADRESSID
FROM ADRESSEN
WHERE VORNAME = :VORNAME
  AND NACHNAME = :NACHNAME
!strasseMacro
!plzMacro
!OrtMacro



if quelle.Strasse=''
then MacroByName('strasseMacro').AsRaw = 'AND STRASSE IS NULL'
else MacroByName('strasseMacro').AsRaw = 'AND STRASSE = :STRASSE';
Gibt es keine elegantere Methode?

Gruß Kostas
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Im Select null oder Wert in WHERE

  Alt 26. Jan 2020, 22:34
Was du im Delphi machst, das kann man auch im SQL machen.
z.B. (das IF als IIF, IFTHEN, CASE oder wie auch immer)
AND IIF(:STRASSE IS NULL, STRASSE IS NULL, STRASSE = :STRASSE)
bzw. da du ja kein NULL, sondern einen Leerstring in der Variable/Parameter hast
AND IIF(:STRASSE = '', STRASSE IS NULL, STRASSE = :STRASSE)
oder sicherheitshalber, falls doch
AND IIF(COALESCE(:STRASSE, '') = '', STRASSE IS NULL, STRASSE = :STRASSE)
AND IIF(NULLIF(:STRASSE, '') IS NULL, STRASSE IS NULL, STRASSE = :STRASSE)
oder
AND ((STRASSE IS NULL AND :STRASSE IS NULL) OR STRASSE = :STRASSE)
AND ((STRASSE IS NULL AND NULLIF(:STRASSE, '') IS NULL) OR STRASSE = :STRASSE) -- wieder das wegen '' oder NULL
oder
AND COALESCE(STRASSE, :STRASSE) = :STRASSE -- bzw. wegen dem '' oder NULL hier im Delphi als Text oder NULL übergeben
AND COALESCE(STRASSE, NULLIF(:STRASSE, '')) IS NOT DISTINCT FROM NULLIF(:STRASSE, '') -- wieder '' oder NULL
AND COALESCE(STRASSE, :STRASSE, '') = COALESCE(:STRASSE, '') -- oder andersrum
$2B or not $2B

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

Registriert seit: 14. Mai 2003
Ort: Gerstrhofen
1.099 Beiträge
 
Delphi 10 Seattle Enterprise
 
#3

AW: Im Select null oder Wert in WHERE

  Alt 26. Jan 2020, 22:53
Hallo himitsu,

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:
Code:
(AND STRASSE = NULL) (AND STRASSE = 'Bahnhofstasse 1')
Was mich auch ärgert:
Eigentlich müsste das SQL so sein:
Code:
FROM ADRESSEN
SELECT NAME, VORNAME
WHERE NAME = :NAME
C# hat das in LINQ versucht besser zu lösen.

Gruß Kostas
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Im Select null oder Wert in WHERE

  Alt 26. Jan 2020, 22: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.
$2B or not $2B

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

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

AW: Im Select null oder Wert in WHERE

  Alt 26. Jan 2020, 23: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
$2B or not $2B

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

Registriert seit: 14. Mai 2003
Ort: Gerstrhofen
1.099 Beiträge
 
Delphi 10 Seattle Enterprise
 
#6

AW: Im Select null oder Wert in WHERE

  Alt 26. Jan 2020, 23: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
Kostas

Registriert seit: 14. Mai 2003
Ort: Gerstrhofen
1.099 Beiträge
 
Delphi 10 Seattle Enterprise
 
#7

AW: Im Select null oder Wert in WHERE

  Alt 26. Jan 2020, 23: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.184 Beiträge
 
Delphi 12 Athens
 
#8

AW: Im Select null oder Wert in WHERE

  Alt 26. Jan 2020, 23: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;
$2B or not $2B

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

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

AW: Im Select null oder Wert in WHERE

  Alt 27. Jan 2020, 00: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.861 Beiträge
 
Delphi 11 Alexandria
 
#10

AW: Im Select null oder Wert in WHERE

  Alt 27. Jan 2020, 09: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
Antwort Antwort
Seite 1 von 2  1 2      


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 20:55 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz