MySQL wählt aus, wo die Spalte nicht leer ist


182

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.


2
Können Sie klarstellen, was Sie unter " phone2hat etwas drin" verstehen ? Die Leute raten, ob Sie meinen phone2, ist NICHT NULL, ist nicht leer, ist nicht ausschließlich Leerzeichen usw.
Pilcrow

1
Wenn "etwas" existiert, ist es offensichtlich nicht null.
Mike

Antworten:


277

Vergleichen Sie den Wert von phone2mit einer leeren Zeichenfolge:

select phone, phone2 
from jewishyellow.users 
where phone like '813%' and phone2<>''

Beachten Sie, dass der NULLWert als interpretiert wird false.


5
Einfache Anführungszeichen, keine doppelten Anführungszeichen.
OMG Ponys

2
phone2<>""schafft es nicht an einem SQL-Syntaxprüfer vorbei.
OMG Ponys

5
@OMG Ponys: Aber es funktioniert in MySQL. Dies ist der einzige Prüfer, der wichtig ist
Ivan Nevostruev

7
@ivan: Neuigkeiten an mich, tut mir leid.
OMG Ponys

<> ist dasselbe wie! =. es war einfach. aber ich wusste es nicht :)
MFarooqi

48

Um zu überprüfen , ob Feld NULL Verwendung ist IS NULL, IS NOT NULLOperatoren.

MySQL-Referenz http://dev.mysql.com/doc/refman/5.0/de/working-with-null.html


10
OP fragt nur nach Zeilen, die etwas im Feld phone2 haben. IS NOT NULL gibt alles zurück, was buchstäblich nicht auf NULL gesetzt ist, auch die leere Zeichenfolge "". ! = '' oder <> '', wie Ivan in der akzeptierten Antwort sagte, gibt keine leeren Zeichenfolgen oder NULL-Werte zurück. Mit anderen Worten, IS NOT NULL ist eine Teilmenge von! = '', Aber sie sind nicht äquivalent.
Keine

34

Auf NULLZeichenfolgenwerte prüfen und diese leeren:

select phone
, phone2 
from users 
where phone like '813%' 
and trim(coalesce(phone2, '')) <>''

NB Ich denke, COALESCE () ist SQL-Standard (-ish), ISNULL () nicht.


1
Sie müssen die Trimmfunktion nicht verwenden, da in MySQL eine Zeichenfolge mit einer beliebigen Anzahl von Leerzeichen einer anderen Zeichenfolge mit einer beliebigen Anzahl von Leerzeichen entspricht. Ich habe darauf als Antwort ausführlich geschrieben. Stackoverflow.com/a/ 42723975/728236
Brian Leishman

25

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)

SELECT t.phone, 
       t.phone2 
  FROM jewishyellow.users t
 WHERE t.phone LIKE '813%' 
   AND t.phone2 > ''

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 NULList 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 Funktionen COALESCE()und IFNULL()ist, dass dies indexfreundlich ist, da Sie die Ausgabe einer Funktion in einem Feld nicht mit irgendetwas vergleichen.

Testfälle:

SELECT if(NULL > '','true','false');-- false
SELECT if('' > '','true','false');-- false
SELECT if(' ' > '','true','false');-- false
SELECT if('\n' > '','true','false');-- false
SELECT if('\t' > '','true','false');-- false
SELECT if('Yeet' > '','true','false');-- true

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.


17

Wenn das Feld phone2 aufgrund einer versehentlichen Dateneingabe Leerzeichen enthält, können Sie diese Datensätze mit den Funktionen IFNULL und TRIM ignorieren:

SELECT phone, phone2
FROM jewishyellow.users
WHERE phone LIKE '813%'
    AND TRIM(IFNULL(phone2,'')) <> '';

Sie müssen die Trimmfunktion nicht verwenden, da in MySQL eine Zeichenfolge mit einer beliebigen Anzahl von Leerzeichen einer anderen Zeichenfolge mit einer beliebigen Anzahl von Leerzeichen entspricht. Ich habe darauf als Antwort ausführlich geschrieben. Stackoverflow.com/a/ 42723975/728236
Brian Leishman

7
select phone, phone2 from jewishyellow.users 
where phone like '813%' and phone2 is not null

6
Beachten Sie, dass es einen Unterschied zwischen einem NULLWert und einer leeren Zeichenfolge gibt, bei ''der es sich um einen Wert handelt. Wenn Sie mit einer leeren Zeichenfolge vergleichen möchten, verwenden Sie diese column <> ''wie in den anderen Antworten vorgeschlagen.
Dzhuneyt

7
SELECT phone, phone2 
FROM jewishyellow.users 
WHERE phone like '813%' and (phone2 <> "");

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.


Ich werde Sie nicht notieren, aber: 1) Es gibt keine NOT()Funktion in MySQL 2) phone2=""wird es nicht über einen SQL-Syntaxprüfer hinaus schaffen.
OMG Ponys

1
Tut mir leid. Ich benutze viele verschiedene SQL Server.
Satanicpuppy

2

Wir können CASE verwenden, um einen leeren Wert auf ein Zeichen oder einen String zu setzen. Ich verwende NA als Standardzeichenfolge.

SELECT phone,   
CASE WHEN phone2 = '' THEN 'NA' END AS phone2 ELSE ISNULL(phone2,0) 
FROM jewishyellow.users  WHERE phone LIKE '813%'

2

Eine andere Alternative besteht darin, CHAR_LENGTHdie 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 0oder NULL. 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

SELECT phone, phone2
FROM users
WHERE phone LIKE '813%'
AND CHAR_LENGTH(phone2) > 0

Tabellendaten

users
phone (varchar 12) | phone2 (int 10)
"813-123-4567"     | NULL
"813-123-4567"     | 1
"813-123-4567"     | 0

users2
phone (varchar 12) | phone2 (varchar 12)
"813-123-4567"     | NULL
"813-123-4567"     | "1"
"813-123-4567"     | "0"
"813-123-4567"     | ""

CHAR_LENGTH(phone2) > 0Ergebnisse (gleich)

users
813-123-4567       | 1
813-123-4567       | 0

users2
813-123-4567       | 1
813-123-4567       | 0

Alternativen

phone2 <> ''Ergebnisse (unterschiedlich)

users
813-123-4567       | 1

users2
813-123-4567       | 1
813-123-4567       | 0

phone2 > ''Ergebnisse (unterschiedlich)

users
813-123-4567       | 1

users2
813-123-4567       | 1
813-123-4567       | 0

COALESCE(phone2, '') <> ''Ergebnisse (gleich)
Hinweis: Die Ergebnisse unterscheiden sich von phone2 IS NOT NULL AND phone2 <> ''denen, die nicht erwartet werden

users
813-123-4567       | 1
813-123-4567       | 0

users2
813-123-4567       | 1
813-123-4567       | 0

phone2 IS NOT NULL AND phone2 <> ''Ergebnisse (unterschiedlich)

users
813-123-4567       | 1

users2
813-123-4567       | 1
813-123-4567       | 0

1

Verwenden:

SELECT t.phone, 
       t.phone2 
  FROM jewishyellow.users t
 WHERE t.phone LIKE '813%' 
   AND t.phone2 IS NOT NULL

1
Mir ist aufgefallen, dass manchmal IS NOT NULLnicht 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.
Dzhuneyt

1

Überraschenderweise (wie noch niemand zuvor erwähnt hat) stellte sich heraus, dass die folgende Bedingung die Aufgabe erfüllt:

WHERE ORD(field_to_check) > 0 

wenn wir sowohl null als auch leere Werte ausschließen müssen. Ist jemandem die Nachteile des Ansatzes bekannt?


0

Sie können einen Platzhalter wie einen Operator verwenden, um dies zu erreichen:

SELECT t.phone, 
       t.phone2 
FROM jewishyellow.users t
WHERE t.phone LIKE '813%' 
  AND t.phone2 like '[0-9]';

Auf diese Weise können Sie alle phone2 erhalten, die ein Nummernpräfix haben.


0

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.

SELECT * FROM `db_name` WHERE `column_name` LIKE '%*%'
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.