Seite 1 von 1
[gelöst] Tabellenfeld (ja/nein) mit SQL mit Bedingungen sieben
Verfasst: Mi 11. Okt 2023, 13:17
von Pit Zyclade
Bin kein Experte, mache mir von jedem erfolgreichen SQL-Befehl Notizen.
Ich habe eine Tabelle mit einem Ja-Nein-Feld in einer HSQL-DB. Eigentlich hat man dort ja drei Zustände ja/nein/nicht ausgefüllt.
Optisch kann man sehen: Häkchen für ja, - für nein und leeres Feld für noch keine Entscheidung.
Nun möchte ich diese Spalte mit SQL abfragen und ggf. modifizieren.
Welche drei Optionen habe ich denn da?
A) ... WHERE "JaFeld" = TRUE
oder
... WHERE "JaFeld" = 1
liefert mir alle Datensätze, bei denen ein Häkchen (also ja) besteht
oder
B) ... WHERE NOT "JaFeld" = TRUE
oder
... WHERE "JaFeld" = ' '
liefert mir alle Datensätze, bei denen das Feld leer ist
oder
C) Hier hapert es bei mir. Wie kann ich die Datensätze sieben, bei denen ein - angezeigt wird?
Wer kann mir helfen?
Re: Tabellenfeld (ja/nein) mit SQL mit Bedingungen sieben
Verfasst: Do 12. Okt 2023, 08:30
von Pit Zyclade
C) ... NOT (WHERE "JaFeld" = 1 OR "JaFeld" = ' ')
liefert tatsächlich nur die Datensätze mit - im JaFeld.
Re: [gelöst] Tabellenfeld (ja/nein) mit SQL mit Bedingungen sieben
Verfasst: Fr 13. Okt 2023, 17:55
von siemer
Total umständlich und zum Teil falsch?! Richtig wären:
WHERE "JaFeld" = TRUE
WHERE "JaFeld" = FALSE
WHERE "JaFeld" IS NULL
Und nun was die komischen Sachen machen (oder wie ich sie verstehe):
Bei A): WHERE "JaFeld" = 1
da wird ein boolesches Feld mit einem Integer verglichen. Da werden die Werte erst umgewandelt, damit man sie vergleichen kann. Wie genau hängt von der Implementierung ab (habe HSQLDB gerade nicht vor mir). Häufig wird 0 zu FALSE gemacht und alles andere zu TRUE. Jetzt hat man zwei boolesche Werte, die man vergleichen kann.
(Bei SQLite ist nur 1 gleich TRUE. 2 und größer sind z.B. weder TRUE noch FALSE... daher kann man hier ordentlich auf die Schnauze fallen.)
Vergleiche mit NULL sind immer NULL, daher:
NULL = FALSE -> NULL
NULL = TRUE -> NULL
NOT NULL -> NULL
Und:
NULL IS NULL -> TRUE
NULL IS NOT NULL -> FALSE
NULL IS (NOT NULL) -> TRUE
(NOT NULL) IS NULL -> TRUE
NOT NULL IS NULL -> FALSE
Der WHERE-Teil muss TRUE sein, damit er zuschlägt. Bei FALSE (klar) und bei NULL (vielleicht nicht ganz so klar) schlägt er nicht an.
Bei B): WHERE NOT "JaFeld" = TRUE
"JaFeld": TRUE --> FALSE
"JaFeld": FALSE --> TRUE
"JaFeld": NULL --> NULL
Schlägt also nur an, wenn "JaFeld" FALSE ist. Ich verstehe hier nicht, warum er bei dir die NULL-Zeilen zeigen soll.
Bei B): WHERE "JaFeld" = ''
Keine Ahnung zu was HSQLDB '' konvertiert. Kann man Probieren mit:
SELECT 3;
(um zu sehen, ob 3 zurückkommt) und
SELECT NULL;
(um zu sehen wie NULL angezeigt wird) und
SELECT TRUE = '';
SELECT FALSE = '';
SELECT NULL = '';
[Das geht bei SQLite. Ohne Tabelle nimmt er eine Tabelle mit einer Zeile aus dem Nichts. Falls das nicht geht, dann ändern zu SELECT 3 FROM tabelle LIMIT 1; etc.]
Re: [gelöst] Tabellenfeld (ja/nein) mit SQL mit Bedingungen sieben
Verfasst: Sa 14. Okt 2023, 07:35
von RobertG
Pit Zyclade hat geschrieben: ↑Mi 11. Okt 2023, 13:17
Optisch kann man sehen: Häkchen für ja, - für nein und leeres Feld für noch keine Entscheidung.
Das "leere Feld" ist 'nein' (False), das Feld mit dem "-" ist NULL. Das merkst Du spätestens, wenn Du so ein feld einer bestehenden Tabelle mit Daten hinzufügst. Da werden bei allen Datensätzen dann Felder mit "-" angezeigt.
Re: [gelöst] Tabellenfeld (ja/nein) mit SQL mit Bedingungen sieben
Verfasst: Sa 14. Okt 2023, 09:10
von Pit Zyclade
...
Schlägt also nur an, wenn "JaFeld" FALSE ist. Ich verstehe hier nicht, warum er bei dir die NULL-Zeilen zeigen soll.
...
[/quote]
Ganz einfach, weil eine Tabelle
OHNE Einträge in der "JaFeld"-Spalte leer aussehen soll und erst wenn ich ja eintrage ein Häkchen erhalten soll. Die beiden schwarz dominierten Zellen mit Häkchen bzw.
minus kann man fast nicht unterscheiden auf die Schnelle.

- jaFeld1.jpg (9.62 KiB) 3617 mal betrachtet
siemer hat geschrieben: ↑Fr 13. Okt 2023, 17:55
Ich danke für die Diskussion, speziell RobertG.
Re: [gelöst] Tabellenfeld (ja/nein) mit SQL mit Bedingungen sieben
Verfasst: Sa 14. Okt 2023, 10:58
von Pit Zyclade
RobertG hat geschrieben: ↑Sa 14. Okt 2023, 07:35
Pit Zyclade hat geschrieben: ↑Mi 11. Okt 2023, 13:17
Optisch kann man sehen: Häkchen für ja, - für nein und leeres Feld für noch keine Entscheidung.
Das "leere Feld" ist 'nein' (False), das Feld mit dem "-" ist NULL. Das merkst Du spätestens, wenn Du so ein feld einer bestehenden Tabelle mit Daten hinzufügst. Da werden bei allen Datensätzen dann Felder mit "-" angezeigt.
Das ist Konvention, da kann man nichts machen,
Aber es ist nicht logisch. Wenn ich ein Feld hinzufüge, dann sollte es noch gar keine Entscheidung haben also "leer" sein. So hätte ich das entworfen, wenn ich was zu sagen gehabt hätte.
Re: [gelöst] Tabellenfeld (ja/nein) mit SQL mit Bedingungen sieben
Verfasst: Sa 14. Okt 2023, 13:25
von F3K Total
Pit Zyclade hat geschrieben: ↑Sa 14. Okt 2023, 10:58
dann sollte es noch gar keine Entscheidung haben also "leer" sein
Moin, das muss ein BUG sein, obwohl ich "NULL" als DEFAULT-WERT eingestellt habe:
Code: Alles auswählen
CREATE TABLE "Tabelle1" ("ID" INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL PRIMARY KEY,"JANEIN" BOOLEAN DEFAULT NULL,"TEXT" VARCHAR(50))
erzeugt LO diese INSERT-Statements, setzt den Wert also auf FALSE:
Code: Alles auswählen
INSERT INTO "Tabelle1" VALUES(0,FALSE,'ww')
INSERT INTO "Tabelle1" VALUES(1,FALSE,'ff')
Wenn ich diesen Befehl ausführe:
Code: Alles auswählen
INSERT INTO "Tabelle1"("TEXT") SELECT "TEXT" FROM "Tabelle1"
wird wirklich der DEFAULT-WERT NULL gesetzt:

- PIT2.png (3.83 KiB) 3605 mal betrachtet
Gruß R
Re: [gelöst] Tabellenfeld (ja/nein) mit SQL mit Bedingungen sieben
Verfasst: Sa 14. Okt 2023, 13:59
von Freischreiber
Das hatten wir schon mal. Ob es drei Zustände gibt oder nur zwei, hängt davon ab, ob die Eingabe erforderlich ist oder nicht, siehe hier:
viewtopic.php?t=14422
Gruß
Freischreiber