SQL IS NULL klappt nicht

WulfmanGER

Commander
Registriert
Juli 2005
Beiträge
2.414
Hi

ich habe eine Tabelle mit 2 Spalten:
* Spalte1 => "text" ... hat IMMER Inhalt
* Spalte2 => "varchar" ... hat entweder nichts als Inhalt oder eine Zahl, Wort.

Die Spalten fülle ich über einen csv-import (; als Trennzeichen).

Jetzt möchte ich alle Einträge sehen in Spalte2 LEER sind.

Code:
SELECT DISTINCT *
FROM `temp_import`
WHERE `Spalte2` IS NULL
Ergebniss: es kommt nichts raus.

Mache ich hier eine IS NOT NULL bekomme ich ALLES angezeigt.

Was mache ich falsch?

Die Felder sind wirklich Leer. Da ist kein Leerschritt - nichts - zumindest erkennt man in phpmyadmin da nichts.

Edit: in php (wo ich den Aufruf schlussendlich brauche), bekomm ich mit

PHP:
if ($row[Spalte2] = "")
auch nicht weiter.


Gruß
Ergänzung ()

Argh - da sucht mal ne halbe Stunde rum warum is null hier nicht klappt - gibt auf, stellt hier ne Frage - sucht was anderes und findet eine Lösung:

Code:
SELECT DISTINCT *
FROM `temp_import`
WHERE NOT Spalte2 != ""
 
Zuletzt bearbeitet:
phpmyadmin müsste da NULL anzeigen, wenn es NULL ist, ansonsten ist es ein leerer String bzw. der Länge 0.


SELECT DISTINCT *
FROM `temp_import`
WHERE `Spalte2` = "" // könnten die falschen Gänsefüßchen sein!

sollte wohl eher passen, wenn deine Einträge nicht NULL sind. In PHP müsste "" raus kommen, wenn da NULL oder "" in der Datenbank steht.

Bei deinem Vergleich machst du jedoch eine Zuweisung, was natürlich immer "wahr" ist:
= ist eine Zuweiseung in PHP
== der Vergleich auf Gleichheit.
 
hi versuchs mal mit:

Code:
SELECT DISTINCT *
FROM `temp_import`
WHERE `Spalte2` LIKE ''
 
Wulfman_SG schrieb:
Die Spalten fülle ich über einen csv-import (; als Trennzeichen).

Jetzt möchte ich alle Einträge sehen in Spalte2 LEER sind.

Code:
SELECT DISTINCT *
FROM `temp_import`
WHERE `Spalte2` IS NULL
Ergebniss: es kommt nichts raus.

Mache ich hier eine IS NOT NULL bekomme ich ALLES angezeigt.

Was mache ich falsch?

Dein Importcode ist fehlerhaft. Wie Du nun schon selber festgestellt hast, wird von Deinem Code ein String der Länge 0 in die DB geschrieben, statt "NULL".


blablub1212 schrieb:
hi versuchs mal mit:

Code:
SELECT DISTINCT *
FROM `temp_import`
WHERE `Spalte2` LIKE ''

Autsch!
Man fragt keine "fixe" Strings mit LIKE (oder ILIKE <-- PostgreSQL für Case Insensitive) ab, sondern nur wenn man Substrings sucht. Das geht zwar, man sollte es aber dennoch nicht machen.
Sucht man nach fixen Strings, dann bitte immer mit "=" suchen.

Hier ein paar weitere Empfehlungen u.a. da es auch gerne immer falsch gemacht wird und dann sogar richtig negative Auswirkungen auf die Performance hat.
  • Teilstring suche:
    Wenn große Datenmengen vorhanden sind und man sich wundert es Sekunden dauert statt einer 1/100stel Sekunde --> Textindizierung verwenden (Obacht: MySQL Default: Strings kleiner 4 werden ignoriert; Außerdem gibt es eine Wörterliste die bei der Suche ebenfalls ignoriert wird (ft_stopword_...). Beide Einstellungen lassen sich in der my.ini ändern --> siehe MySQL Dokumentation)
  • Subselect mit ... IN (SELECT...) statt JOIN...einer der absoluten Performance Killer. Besser ist es hier folgendes zu verwenden:
    Code:
    SELECT * FROM sometable1 AS tab1 INNER JOIN sometable2 AS tab2 ON tab1.col1=tab2.col1 WHERE tab1.col2='suchwort';
  • Import von Daten beschleunigen/fortlaufende INSERT INTO..:
    1. Batch-Inserts verwenden!
    2. Bei Java den neuen Connector/J verwenden: In der URL den Parameter "rewriteBatchedStatements=true" anhängen. Dann wird zusätzlich noch zu den Batch Inserts der INSERT INTO automatisch neu geschrieben und zwar in der Form:
      Code:
      INSERT INTO sometable (col1, col2) VALUES (1, "text1"), (2, "text2"), (3, "text3"), (4, "text4"),...;
      ...statt...
      Code:
      INSERT INTO sometable (col1, col2) VALUES (1, "text1");
      INSERT INTO sometable (col1, col2) VALUES (2, "text2");
      INSERT INTO sometable (col1, col2) VALUES (3, "text3");
      INSERT INTO sometable (col1, col2) VALUES (4, "text4");
      ...
      siehe Mark Matthews Blog (Connector/J Entwickler): http://www.jroller.com/mmatthews/entry/speeding_up_batch_inserts_for
 
Zuletzt bearbeitet:
Die ursprünglich gesuchte Funktion heißt übrigens ISNULL.

blablub1212 schrieb:
hi versuchs mal mit:

Code:
SELECT DISTINCT *
FROM `temp_import`
WHERE `Spalte2` LIKE ''

Da hat aber jemand sehr viel Vertrauen in den SQL-Optimierer.
 
ISNULL ist eine Funktion, IS NULL ein Operator. Somit ist die gesuchte Funktion nicht ISNULL!
 
IceMatrix schrieb:
ISNULL ist eine Funktion, IS NULL ein Operator. Somit ist die gesuchte Funktion nicht ISNULL!

Verzeihung, 'IS NULL' als Operator war mir gänzlich unbekannt. Man lernt eben nie aus.
 
Hi

hatte das ja mit phpmyadmin versucht rauszufiltern - das macht das schon richtig ;) zumindest vom syntax her richtiger als ich ;) - was ich oben hingepastet habe, war wieder so ne mischung aus php und mysql-syntax - da kämpfe ich immer mit ` ' " ... aber irgendwie klappt am ende fast jede kombi ;) php/mysql hat halt ein herz für daus ;)

Nur
WHERE NOT Spalte2 != ""
klappte so nicht in phpmyadmin EINZUSTELLEN (im Suche-Dialog [2er phpMyadmin]) ... hatte nur WHERE Spalte2 != "" hinbekommen... sogar mit ="" hab ich probiert - nix. Erst das NOT hat das Ergebis gebracht (was ich dann unter sql bearbeiten oder wie es heißt, direkt eingetippert habe). Wie abschließend geschrieben hab ich das durch zufall bei der suche nach dem nächsten Problem gefunden ;)

Gruß
 
Zurück
Oben