it-swarm.com.de

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

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 phone2 etwas enthält.

161
mike

Vergleich des Wertes von phone2 mit leerer Zeichenfolge:

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

Beachten Sie, dass NULL value als false interpretiert wird.

241
Ivan Nevostruev

Um zu überprüfen, ob das Feld NULL ist, verwenden Sie die Operatoren IS NULL, IS NOT NULL.

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

44

Suchen Sie nach NULL und leeren Zeichenfolgenwerten:

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

N.B. Ich denke, COALESCE () ist SQL-Standard (-ish), ISNULL () dagegen nicht.

30
davek

Wenn im Feld Telefon 2 durch versehentliche Dateneingaben Leerzeichen vorhanden sind, 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,'')) <> '';
15
micahwittman

Eine Antwort, die ich verwendet habe, hat für mich ziemlich gut funktioniert, die ich hier nicht schon gesehen habe (diese Frage ist sehr alt, daher hat sie vielleicht nicht funktioniert) 

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

Beachten Sie den > ''-Teil, der prüft, ob der Wert nicht null ist und ob der Wert nicht nur Leerzeichen oder Leerzeichen ist. 

Wenn im Feld etwas anderes als Whitespace oder NULL enthalten ist, ist dies wahr. Es ist auch super kurz, so dass es einfach zu schreiben ist. Ein weiterer Pluspunkt gegenüber den Funktionen COALESCE() und IFNULL() ist, dass dies indexfreundlich ist, da Sie die Ausgabe einer Funktion in einem Feld nicht mit etwas 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 Hier gibt es eine Einschränkung, die ich nicht erwartet hätte, aber numerische Werte, die null oder darunter sind, sind nicht größer als eine leere Zeichenfolge, also falls Sie dies tun) Umgang mit Zahlen, die Null oder Negativ sein können (TUN DIESE NICHT}, hat mich vor kurzem gebissen und war sehr schwer zu debuggen :(

Wenn Sie Zeichenfolgen (Zeichen, Varchar, Text usw.) verwenden, wird dies perfekt sein, seien Sie vorsichtig mit den Zahlen. 

14
Brian Leishman
select phone, phone2 from jewishyellow.users 
where phone like '813%' and phone2 is not null
SELECT phone, phone2 
FROM jewishyellow.users 
WHERE phone like '813%' and (phone2 <> "");

Möglicherweise müssen Sie einige Änderungen vornehmen, je nachdem, was Ihr Standardwert ist. Wenn Sie Null füllen durften, können Sie stattdessen "Nicht NULL" verwenden, was offensichtlich besser ist.

4
Satanicpuppy

Wir können CASE verwenden, um einen leeren Wert auf ein Zeichen oder einen String zu setzen. Ich benutze 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
Atul

Benutzen:

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

sie können wie Operator-Platzhalter 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 mit einem Nummernpräfix erhalten.

0
Panda

In meinem Fall hatte ich eine varchar-Spalte, beide Methoden von IS NOT NULL & != '' haben nicht funktioniert , aber das folgende hat für mich funktioniert. Einfach das hier rausbringen.

SELECT * FROM `db_name` WHERE `column_name` LIKE '%*%'
0

Eine andere Alternative besteht darin, sich speziell den CHAR_LENGTH der Spaltenwerte anzusehen. (nicht zu verwechseln mit LENGTH)

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. bei einer Ganzzahlspalte mit dem Wert 0 oder NULL. Konsequenteres Verhalten bei unterschiedlichen Datentypen.

Dies führt zu einem Wert, der mindestens 1 Zeichen lang oder ansonsten nicht leer ist.

Beispielhttps://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) > 0 Results (same)

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

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

Alternativen

phone2 <> '' Ergebnisse (anders)

users
813-123-4567       | 1

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

phone2 > '' Ergebnisse (anders)

users
813-123-4567       | 1

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

COALESCE(phone2, '') <> '' Results (same)
Hinweis: Die Ergebnisse unterscheiden sich von dem nicht erwarteten phone2 IS NOT NULL AND phone2 <> ''

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 (anders)

users
813-123-4567       | 1

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