Kann ich in MySQL nur Spalten auswählen, in denen etwas vorhanden ist?
Zum Beispiel habe ich die folgende Abfrage:
select phone, phone2
from jewishyellow.users
where phone like '813%'
and phone2
Ich versuche nur die Zeilen auszuwählen, in denen das Telefon mit 813 beginnt und in phone2 etwas enthalten ist.
phone2
hat etwas drin" verstehen ? Die Leute raten, ob Sie meinenphone2
, ist NICHT NULL, ist nicht leer, ist nicht ausschließlich Leerzeichen usw.Antworten:
Vergleichen Sie den Wert von
phone2
mit einer leeren Zeichenfolge:Beachten Sie, dass der
NULL
Wert als interpretiert wirdfalse
.quelle
phone2<>""
schafft es nicht an einem SQL-Syntaxprüfer vorbei.Um zu überprüfen , ob Feld NULL Verwendung ist
IS NULL
,IS NOT NULL
Operatoren.MySQL-Referenz http://dev.mysql.com/doc/refman/5.0/de/working-with-null.html
quelle
Auf
NULL
Zeichenfolgenwerte prüfen und diese leeren:NB Ich denke, COALESCE () ist SQL-Standard (-ish), ISNULL () nicht.
quelle
Eine Antwort, die ich verwendet habe, hat für mich ganz gut funktioniert, die ich hier noch nicht gesehen habe (diese Frage ist sehr alt, also hat sie damals vielleicht nicht funktioniert)
Beachten Sie die
> ''
Teil, der prüft, ob der Wert nicht null ist und ob der Wert nicht nur Leerzeichen oder Leerzeichen ist.Grundsätzlich
NULL
ist es wahr , wenn das Feld etwas anderes als Leerzeichen enthält . Es ist auch super kurz, so dass es einfach zu schreiben ist, und ein weiteres Plus gegenüber den FunktionenCOALESCE()
undIFNULL()
ist, dass dies indexfreundlich ist, da Sie die Ausgabe einer Funktion in einem Feld nicht mit irgendetwas vergleichen.Testfälle:
UPDATE Es gibt eine Einschränkung, die ich nicht erwartet habe, aber numerische Werte, die Null oder weniger sind, sind nicht größer als eine leere Zeichenfolge. Wenn Sie also mit Zahlen arbeiten, die Null oder negativ sein können , tun Sie dies NICHT . es hat mich vor kurzem gebissen und war sehr schwer zu debuggen :(
Wenn Sie Zeichenfolgen (char, varchar, text usw.) verwenden, ist dies vollkommen in Ordnung. Gehen Sie nur vorsichtig mit Zahlen um.
quelle
Wenn das Feld phone2 aufgrund einer versehentlichen Dateneingabe Leerzeichen enthält, können Sie diese Datensätze mit den Funktionen IFNULL und TRIM ignorieren:
quelle
quelle
NULL
Wert und einer leeren Zeichenfolge gibt, bei''
der es sich um einen Wert handelt. Wenn Sie mit einer leeren Zeichenfolge vergleichen möchten, verwenden Sie diesecolumn <> ''
wie in den anderen Antworten vorgeschlagen.Abhängig von Ihrem Standardwert müssen möglicherweise einige Anpassungen vorgenommen werden. Wenn Sie das Füllen mit Null zugelassen haben, können Sie stattdessen "Nicht NULL" ausführen, was offensichtlich besser ist.
quelle
NOT()
Funktion in MySQL 2)phone2=""
wird es nicht über einen SQL-Syntaxprüfer hinaus schaffen.Wir können CASE verwenden, um einen leeren Wert auf ein Zeichen oder einen String zu setzen. Ich verwende NA als Standardzeichenfolge.
quelle
Eine andere Alternative besteht darin,
CHAR_LENGTH
die Spaltenwerte speziell zu betrachten . (nicht zu verwechseln mitLENGTH
)Wenn Sie ein Kriterium verwenden, bei dem die Zeichenlänge größer als 0 ist, werden Fehlalarme vermieden, wenn die Spaltenwerte falsch sein können, z. B. im Fall einer ganzzahligen Spalte mit dem Wert
0
oderNULL
. Konsistenteres Verhalten über verschiedene Datentypen hinweg.Dies führt zu einem Wert, der mindestens 1 Zeichen lang oder anderweitig nicht leer ist.
Beispiel https://www.db-fiddle.com/f/iQvEhY1SH6wfruAvnmWdj5/1
Tabellendaten
CHAR_LENGTH(phone2) > 0
Ergebnisse (gleich)Alternativen
phone2 <> ''
Ergebnisse (unterschiedlich)phone2 > ''
Ergebnisse (unterschiedlich)COALESCE(phone2, '') <> ''
Ergebnisse (gleich)Hinweis: Die Ergebnisse unterscheiden sich von
phone2 IS NOT NULL AND phone2 <> ''
denen, die nicht erwartet werdenphone2 IS NOT NULL AND phone2 <> ''
Ergebnisse (unterschiedlich)quelle
Verwenden:
quelle
IS NOT NULL
nicht nur auf Zeichenfolgenspalten mit leeren Werten (''
) angewendet wird . Ich weiß nicht warum, wollte aber nur darauf hinweisen. Es ist klüger,t.phone2 <> ''
nach leeren Zeichenfolgenspalten zu suchen.Überraschenderweise (wie noch niemand zuvor erwähnt hat) stellte sich heraus, dass die folgende Bedingung die Aufgabe erfüllt:
wenn wir sowohl null als auch leere Werte ausschließen müssen. Ist jemandem die Nachteile des Ansatzes bekannt?
quelle
Sie können einen Platzhalter wie einen Operator verwenden, um dies zu erreichen:
Auf diese Weise können Sie alle phone2 erhalten, die ein Nummernpräfix haben.
quelle
In meinem Fall hatte ich eine Varchar-Spalte, beide Methoden von
IS NOT NULL
&!= ''
funktionierten nicht , aber die folgenden funktionierten für mich. Einfach hier rausbringen.quelle