gesperrt <> 1

Für Themen zu Datenbanken und Zugriff auf diese. Auch für Datenbankkomponenten.
Antworten
Benutzeravatar
fliegermichl
Lazarusforum e. V.
Beiträge: 1435
Registriert: Do 9. Jun 2011, 09:42
OS, Lazarus, FPC: Lazarus Fixes FPC Stable
CPU-Target: 32/64Bit
Wohnort: Echzell

gesperrt <> 1

Beitrag von fliegermichl »

Hallo zusammen,

MySQL MariaDB: ich habe eine Tabelle kontakt. Diese hat ein Feld gesperrt tinyint null default null.
Wenn ich jetzt

Code: Alles auswählen

select id, email, gesperrt from kontakt where gesperrt <> 1
abrufe, dann erscheinen alle Datensätze nicht, bei denen das Feld = NULL ist.
Ist das nicht falsch? Weil NULL <> 1

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6209
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: gesperrt <> 1

Beitrag von af0815 »

NULL ist ein sehr eigenwillige Nichts. Es gibt extra Ausdrücke wie ISNULL, IS NULL dafür um es abzufragen. Man kann also mit einem einfachen Vergleich "gesperrt <> 1" nicht arbeiten. daher entweder das IS NULL berücksichtigen oder einen Default setzen.

ISNULL
https://learn.microsoft.com/en-us/sql/t ... rver-ver16
IS NULL oder IS NOT NULL
https://www.w3schools.com/sql/sql_null_values.asp
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Sieben
Beiträge: 202
Registriert: Mo 24. Aug 2020, 14:16
OS, Lazarus, FPC: Ubuntu Xenial 32, Lazarus 2.2.0, FPC 3.2.2
CPU-Target: i386

Re: gesperrt <> 1

Beitrag von Sieben »

Mir hat es geholfen, NULL als 'undefiniert' oder als '(noch) nicht festgelegt' zu denken. Dann wird recht klar, dass eine Abfrage wie 'gesperrt <> 1' einfach keine Aussage über ein Feld mit dem Inhalt NULL machen kann - es ist schlichtweg (noch) kein Wert bekannt. Da die Frage, ob der Wert <> 1 ist, also (noch) nicht beantwortet werden kann, tauchen die entsprechenden Datensätze in der Ergebnismenge nicht auf.

Benutzeravatar
fliegermichl
Lazarusforum e. V.
Beiträge: 1435
Registriert: Do 9. Jun 2011, 09:42
OS, Lazarus, FPC: Lazarus Fixes FPC Stable
CPU-Target: 32/64Bit
Wohnort: Echzell

Re: gesperrt <> 1

Beitrag von fliegermichl »

Danke, ich habe es jetzt so gelöst, daß ich die Tabellendefinition auf gesperrt not null default 0 umgestellt habe. Jetzt klappt das ohne Verrenkungen.

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6209
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: gesperrt <> 1

Beitrag von af0815 »

fliegermichl hat geschrieben:
Mi 11. Jan 2023, 18:50
Danke, ich habe es jetzt so gelöst, daß ich die Tabellendefinition auf gesperrt not null default 0 umgestellt habe. Jetzt klappt das ohne Verrenkungen.
Ja ja, eine binäre Logik, die aber trinär ist, ist schon eine gewisse Herausforderung :-)
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

charlytango
Beiträge: 843
Registriert: Sa 12. Sep 2015, 12:10
OS, Lazarus, FPC: Laz stable (2.2.6, 3.x)
CPU-Target: Win 32/64, Linux64
Wohnort: Wien

Re: gesperrt <> 1

Beitrag von charlytango »

fliegermichl hat geschrieben:
Mi 11. Jan 2023, 18:50
Danke, ich habe es jetzt so gelöst, daß ich die Tabellendefinition auf gesperrt not null default 0 umgestellt habe. Jetzt klappt das ohne Verrenkungen.
Das klappt jetzt sicher.
Ich verwende für derartige Flag-Felder meistens Datumsfelder, dann habe ich nicht nur die Information ob zB ein Kontakt gesperrt wurde sondern auch wann. Wenns nicht allzu genau sein muss kann man in die Millisekunden auch noch das "wer" reinkodieren. Oder ein zusätzliches Feld bzw eine History bemühen.

Benutzeravatar
fliegermichl
Lazarusforum e. V.
Beiträge: 1435
Registriert: Do 9. Jun 2011, 09:42
OS, Lazarus, FPC: Lazarus Fixes FPC Stable
CPU-Target: 32/64Bit
Wohnort: Echzell

Re: gesperrt <> 1

Beitrag von fliegermichl »

charlytango hat geschrieben:
Mi 11. Jan 2023, 20:37
fliegermichl hat geschrieben:
Mi 11. Jan 2023, 18:50
Danke, ich habe es jetzt so gelöst, daß ich die Tabellendefinition auf gesperrt not null default 0 umgestellt habe. Jetzt klappt das ohne Verrenkungen.
Das klappt jetzt sicher.
Ich verwende für derartige Flag-Felder meistens Datumsfelder, dann habe ich nicht nur die Information ob zB ein Kontakt gesperrt wurde sondern auch wann. Wenns nicht allzu genau sein muss kann man in die Millisekunden auch noch das "wer" reinkodieren. Oder ein zusätzliches Feld bzw eine History bemühen.
Hm, ist ansich eine gute Idee. Wie sieht dann aber der select aus, wenn ich wissen will, wer hat wann welchen Kontakt gesperrt :-)

charlytango
Beiträge: 843
Registriert: Sa 12. Sep 2015, 12:10
OS, Lazarus, FPC: Laz stable (2.2.6, 3.x)
CPU-Target: Win 32/64, Linux64
Wohnort: Wien

Re: gesperrt <> 1

Beitrag von charlytango »

in etwa so:

Code: Alles auswählen

DROP TABLE IF EXISTS test;

CREATE TABLE test (
  id int NOT NULL AUTO_INCREMENT,
  dt datetime(6),
  PRIMARY KEY (id)
);

INSERT INTO test (dt) VALUES (NOW()), (NOW(6));

INSERT INTO test (dt) VALUES (CAST('2009-12-31 23:59:59.998877' as DATETIME(6)));

SELECT * FROM test;

SELECT * FROM test WHERE MICROSECOND(dt)=998877;

SELECT * FROM test WHERE MICROSECOND(dt)=998877 AND DATE(dt)='2009-12-31';
https://mariadb.com/kb/en/date-time-functions/
https://mariadb.com/kb/en/date-and-time-units/

Etwas ähnliches lässt sich sicher auch mit anderen SQL-Servern machen

Benutzeravatar
six1
Beiträge: 788
Registriert: Do 1. Jul 2010, 19:01

Re: gesperrt <> 1

Beitrag von six1 »

Naja, in der Tabelle wird ja noch Platz für einen INT sein, um den Sperr-User zu identifizieren 8)
Gruß, Michael

Joh
Lazarusforum e. V.
Beiträge: 187
Registriert: Sa 26. Mai 2012, 17:31
OS, Lazarus, FPC: Win 10 (L 2.2.6 x64 FPC 3.2.2)
CPU-Target: 64Bit

Re: gesperrt <> 1

Beitrag von Joh »

six1 hat geschrieben:
Fr 13. Jan 2023, 13:25
Naja, in der Tabelle wird ja noch Platz für einen INT sein, um den Sperr-User zu identifizieren 8)
wenn man das wissen will, dann ist es IMHO besser, zusätzlich eine Protokolldatei zu führen.
Nach dem Motto:
- Timestamp
- User
- Tabelle
- Aktion (angelegt, geändert, gesperrt, entsperrt, gelöscht etc.)
just my two Beer

Vbxler
Beiträge: 125
Registriert: Sa 25. Mai 2013, 07:43
OS, Lazarus, FPC: Win7_x64 (FPC:4.7.1)
CPU-Target: 32Bit

Re: gesperrt <> 1

Beitrag von Vbxler »

Es gibt bei den verschiedenen RDMS meist eine Möglichkeit bei
einem NULL in der Zelle einen Ersatzwert in der Abfrage zu liefern.

Bei Interbase mache ich es so:

Code: Alles auswählen

'SELECT COALESCE(MESSWERT_01, 0.0) FROM TBL_MESSWERTE where STATUS = 1 ORDER BY DATE_TIME ASC';
Liegt in der Zelle NULL vor, dann wird 0.0 geliefert.
Vbxler
-------------------------

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6209
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: gesperrt <> 1

Beitrag von af0815 »

Vbxler hat geschrieben:
Sa 14. Jan 2023, 14:12
Es gibt bei den verschiedenen RDMS meist eine Möglichkeit bei
einem NULL in der Zelle einen Ersatzwert in der Abfrage zu liefern.
Deswegen habe ich schon auf ISNULL verwiesen, was für den MSSQL funktioniert. Das verhalten bei NULL ist vom SQL-Server abhängig, auch welcher Befehl da etwas bewirkt. Das zeigt zum Beispiel hier MS SQL Server <> Interbase.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Vbxler
Beiträge: 125
Registriert: Sa 25. Mai 2013, 07:43
OS, Lazarus, FPC: Win7_x64 (FPC:4.7.1)
CPU-Target: 32Bit

Re: gesperrt <> 1

Beitrag von Vbxler »

Ich habe mich weder auf Ihr Posting bezogen,
noch habe ich die Behauptung aufgestellt, dass MSSQL = Interbase wäre.

Ich wollte lediglich darauf hinweisen, wie man es bei Interbase lösen könnte.

Entschuldigung für das Posting, es wird sichern nicht wieder vorkommen.
Vbxler
-------------------------

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6209
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: gesperrt <> 1

Beitrag von af0815 »

Das war auch keine Kritik, sondern der Hinweis daß solche Feinheiten bereits unterschiedlich sein können. Weil derjenige der das versucht, vielleicht den falschen Server oder manchmal auch nur eine Version des Servers, die das nicht kann.

Für mich persönlich war das klar, weil der Server dabei gestanden ist, allerdings wird am MS SQL etwas anderes verwendet. Wie SQlite oder MariaDB das handhaben weiß ich aktuell gar nicht. Es könnte das Verhalten aber auch noch von den Komponenten zusätzlich abhängen, zumindest ist mir das gerade eingefallen. Kompliziert halt. :D
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

charlytango
Beiträge: 843
Registriert: Sa 12. Sep 2015, 12:10
OS, Lazarus, FPC: Laz stable (2.2.6, 3.x)
CPU-Target: Win 32/64, Linux64
Wohnort: Wien

Re: gesperrt <> 1

Beitrag von charlytango »

af0815 hat geschrieben:
So 15. Jan 2023, 16:29
Kompliziert halt. :D
Aber vermeidbar wenn man sich der grundlegenden Problematik bewusst ist.
Dann ist eben das Tabellendesign binär statt trinär. Wichtig ist nur zu wissen was man sich mit welcher Variante (oder auch Kundenvorgabe) einbrockt und wie man damit umgehen will.

Antworten