Entwickler-Ecke

Datenbanken - Frage zu MySQL und "not like...."


pesi - Do 23.12.10 15:38
Titel: Frage zu MySQL und "not like...."
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 - 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 - Do 23.12.10 16:18

Das ist SQL-Sandardverhalten.
unter MSSQL könnte man es so machen

Quelltext
1:
select * from TabelleX where COALESECE(FeldA,'') not like 'Artikel%'                    

unter Access

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.


pesi - 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 - 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,..)


Narses - 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


Martok - 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:

SQL-Anweisung
1:
mysql> select null like 'test';                    


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



SQL-Anweisung
1:
mysql> select not null;                    


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.