Autor Beitrag
pesi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 67
Erhaltene Danke: 1



BeitragVerfasst: Do 23.12.10 15:38 
Hallo,
mir ist gerade mit Schrecken etwas aufgefallen und ich wollte mal fragen ob das generell so ist, oder ob ich etwas falsch mache!?!?

Ich habe ein " select * from TabelleX where FeldA not like 'Artikel%' "

Das Ergebnis sind zwar alle Datensätze die in FeldA z.B. "Fred", "Hildtrud" oder sonst was drinstehen haben, aber es werden NICHT die Datensätze ausgegeben bei denen FeldA leer ist (also Null). Ähem... wenn ein Wert ungleich "Artikel%" ist, dann doch wohl ein komplett leeres Feld! Ist das wirklich so (also ich hab´s ja getestet und es IST so)!? ....nur glauben kann und will ich das nicht?

Gibt´s einen Trick, muss ich etwas anders machen oder muss ich das o.g. Statement wirklich um ein "or FeldA is Null" erweitern???

Danke & Gruß
Peter
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Do 23.12.10 15:53 
Nun ja, like kann nur bei Feldern geprüft werden, die nicht Null sind. Und darauf wird dann not angewendet. Deshalb wird das schon so korrekt sein.
bummi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1248
Erhaltene Danke: 187

XP - Server 2008R2
D2 - Delphi XE
BeitragVerfasst: Do 23.12.10 16:18 
Das ist SQL-Sandardverhalten.
unter MSSQL könnte man es so machen
ausblenden Quelltext
1:
select * from TabelleX where COALESECE(FeldA,'') not like 'Artikel%'					

unter Access
ausblenden Quelltext
1:
select * from TabelleX where IIF(FeldA is NULL,'',FeldA) not like 'Artikel%'					

bei MySQL muß ich passen, ich denke aber es muß entsprechendes geben.
Wobei ein "OR FeldA is null" IMHO auch nicht weh tut.

_________________
Das Problem liegt üblicherweise zwischen den Ohren H₂♂
DRY DRY KISS
pesi Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 67
Erhaltene Danke: 1



BeitragVerfasst: Do 23.12.10 16:27 
@Jaenicke: Es ist nur so sinnlos und für mein Verständnis absolut unlogisch!

@Bummi: Ne, diese Erweiterung des Statements tut mir sicher nicht weh (wenn ich mich an anderen Stellen nicht bereits auf ein "korrektes" Verhalten verlassen hätte und das jetzt alles noch anpassen muss :evil: ).

Wollte es einfach nur nochmal hier bestätigt haben, dass "not like" sich imho "unlogisch" verhält! :shock:
Danke Euch!
bummi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1248
Erhaltene Danke: 187

XP - Server 2008R2
D2 - Delphi XE
BeitragVerfasst: Do 23.12.10 16:34 
Eigentlich muß man es nur wissen...
NULL kann nicht mit Vergleichsoperatoren geprüft werden, sondern mit IS NULL bzw. IS NOT NULL
Jeder Verkettung oder Rechenoperation mit NULL ergibt immer NULL, außer bei Aggregatfuntionen (SUM,AVG,..)

_________________
Das Problem liegt üblicherweise zwischen den Ohren H₂♂
DRY DRY KISS
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10183
Erhaltene Danke: 1256

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Do 23.12.10 16:38 
Moin!

user profile iconpesi hat folgendes geschrieben Zum zitierten Posting springen:
Wollte es einfach nur nochmal hier bestätigt haben, dass "not like" sich imho "unlogisch" verhält!
Nun ja, vielleicht ist dein Verständis des "Wertes" NULL ja auch updatebedürftig. ;) NULL repräsentiert einen abwesenden Wert, also einen nicht-Wert. Folglich kann ein nicht vorhandener Wert auch nie LIKE irgendwas sein. Das NOT bezieht sich aber auf das LIKE, also: alles korrekt. :idea: :nixweiss:

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.
Martok
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 3661
Erhaltene Danke: 604

Win 8.1, Win 10 x64
Pascal: Lazarus Snapshot, Delphi 7,2007; PHP, JS: WebStorm
BeitragVerfasst: Do 23.12.10 18:29 
Genau, user profile iconNarses.

Die einzigen, die das anders sehen könnten sind Oracle, die NULL in VARCHAR abweichend vom Rest der Welt (und dem SQL-Standard) als Leerstring behandeln. Das ist aber falsch und führt oft zu fehlerhaftem Programmverhalten, wenn man von anderen DBs migriert!

Grundsätzlich ist es aber so, dass (fast?) alle Operationen, wenn (eines der) ihr Argument(e) NULL ist auch NULL zurückgeben:
ausblenden SQL-Anweisung
1:
mysql> select null like 'test';					

ausblenden Quelltext
1:
2:
3:
4:
5:
6:
+------------------+
| null like 'test' |
+------------------+
|             NULL |
+------------------+
1 row in set (0.00 sec)


ausblenden SQL-Anweisung
1:
mysql> select not null;					

ausblenden Quelltext
1:
2:
3:
4:
5:
6:
+----------+
| not null |
+----------+
|     NULL |
+----------+
1 row in set (0.00 sec)

Und damit false-y für das Endergebnis, so dass der Satz nicht erfasst wird.

_________________
"The phoenix's price isn't inevitable. It's not part of some deep balance built into the universe. It's just the parts of the game where you haven't figured out yet how to cheat."