MySQL seleziona dove la colonna non è vuota


182

In MySQL, posso selezionare le colonne solo dove esiste qualcosa?

Ad esempio, ho la seguente query:

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

Sto cercando di selezionare solo le righe in cui il telefono inizia con 813 e phone2 contiene qualcosa.


2
Puoi chiarire cosa intendi con " phone2contiene qualcosa?" Le persone stanno ipotizzando se intendi che phone2NON È NULL, non è vuoto, non è esclusivamente spazi bianchi, ecc.
pilcrow

1
se "qualcosa" esiste, ovviamente non è nullo.
mike,

Risposte:


277

Confronta il valore di phone2con stringa vuota:

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

Si noti che il NULLvalore viene interpretato come false.


5
Virgolette singole, non doppie.
OMG Pony

2
phone2<>""non supererà alcun controllo sintassi SQL.
OMG Ponies,

5
Pony @OMG: ma funziona in mysql. Questa è l'unica pedina che conta
Ivan Nevostruev l'

7
@ivan: notizie per me, mi dispiace per quello.
OMG Pony

<> è uguale a! =. era semplice. ma non lo sapevo :)
MFarooqi,

48

Per verificare se il campo è NULL IS NULL, utilizzare IS NOT NULLoperatori.

Riferimento MySql http://dev.mysql.com/doc/refman/5.0/en/working-with-null.html


10
OP chiede solo le righe che hanno qualcosa nel campo phone2. IS NOT NULL restituisce tutto ciò che letteralmente non è impostato su NULL, anche la stringa vuota "". ! = '' o <> '', come ha detto Ivan nella risposta accettata, non restituirà stringhe vuote o valori NULL. In altre parole, IS NOT NULL è un sottoinsieme di! = '', Ma non sono equivalenti.
Nessuno

34

Verifica NULLe svuota i valori di stringa:

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

NB Penso che COALESCE () sia lo standard SQL (-ish), mentre ISNULL () non lo è.


1
Non è necessario utilizzare la funzione di taglio, poiché in MySQL una stringa di qualsiasi numero di spazi è uguale a un'altra stringa di qualsiasi numero di spazi, ho scritto la risposta su questo in alcuni dettagli stackoverflow.com/a/ 42723975/728236
Brian Leishman

26

Una risposta che sto usando che ha funzionato abbastanza bene per me che non avevo già visto qui (questa domanda è molto vecchia, quindi potrebbe non aver funzionato allora) è in realtà

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

Notare la > ''parte, che controllerà se il valore non è null e se il valore non è solo uno spazio o uno spazio.

Fondamentalmente, se il campo contiene qualcosa di diverso dallo spazio bianco o NULL, è vero. È anche super breve, quindi è facile da scrivere, e un altro vantaggio rispetto alle funzioni COALESCE()e IFNULL()è che questo è indice amichevole, poiché non stai confrontando l'output di una funzione su un campo con nulla.

Casi test:

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

AGGIORNAMENTO C'è un avvertimento che non mi aspettavo, ma i valori numerici che sono zero o inferiori non sono maggiori di una stringa vuota, quindi se hai a che fare con numeri che possono essere zero o negativi, NON FARE QUESTO , mi ha morso molto di recente ed è stato molto difficile eseguire il debug :(

Se stai usando stringhe (char, varchar, text, ecc.), Allora andrà benissimo, stai attento con i numeri.


17

Se ci sono spazi nel campo phone2 dall'inserimento involontario di dati, è possibile ignorare quei record con le funzioni IFNULL e TRIM:

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

Non è necessario utilizzare la funzione di taglio, poiché in MySQL una stringa di qualsiasi numero di spazi è uguale a un'altra stringa di qualsiasi numero di spazi, ho scritto la risposta su questo in alcuni dettagli stackoverflow.com/a/ 42723975/728236
Brian Leishman

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

6
Si noti che esiste una differenza tra un NULLvalore e una stringa vuota ''che è un valore. Se si desidera verificare con una stringa vuota, utilizzare column <> ''come suggerito dalle altre risposte.
Dzhuneyt,

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

Potrebbe essere necessario apportare modifiche in base al valore predefinito. Se hai permesso il riempimento Null, puoi invece fare "Not NULL", il che è ovviamente migliore.


Non ti segnerò in basso ma: 1) Non c'è alcuna NOT()funzione in MySQL 2) phone2=""non riuscirà a superare qualsiasi controllo sintassi SQL.
OMG Ponies,

1
Heh, scusa. Uso molti server SQL diversi.
Satanicpuppy,

2

Possiamo usare CASE per impostare un valore vuoto su qualche carattere o stringa. Sto usando NA come stringa predefinita.

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

2

Un'altra alternativa è esaminare in modo specifico CHAR_LENGTHi valori della colonna. (da non confondere LENGTH)

Utilizzando un criterio in cui la lunghezza del carattere è maggiore di 0, si eviteranno falsi positivi quando i valori della colonna possono essere falsi, ad esempio nel caso di una colonna intera con un valore di 0o NULL. Comportarsi in modo più coerente tra vari tipi di dati.

Il risultato è un valore che contiene almeno 1 carattere o non è vuoto.

Esempio https://www.db-fiddle.com/f/iQvEhY1SH6wfruAvnmWdj5/1

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

Dati tabella

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 risultati (stessi)

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

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

alternative

phone2 <> '' risultati (diversi)

users
813-123-4567       | 1

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

phone2 > '' risultati (diversi)

users
813-123-4567       | 1

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

COALESCE(phone2, '') <> ''Risultati (stesso)
Nota: i risultati differiscono da quelli phone2 IS NOT NULL AND phone2 <> ''non previsti

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

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

phone2 IS NOT NULL AND phone2 <> ''Risultati (diversi)

users
813-123-4567       | 1

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

2

Sorprendentemente (come nessun altro ha menzionato prima) ha scoperto che la condizione seguente fa il lavoro:

WHERE ORD(field_to_check) > 0 

quando dobbiamo escludere sia valori nulli che vuoti. Qualcuno è a conoscenza degli svantaggi dell'approccio?


ci sto provando da ore per ottenere la sintassi corretta e questo ha risolto tutto grazie!
demo7up

1

Uso:

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

1
Ho notato che a volte IS NOT NULLnon viene applicato a stringhe solo colonne con valori vuoti ( ''). Non so perché, ma volevo solo precisarlo. È più saggio usare t.phone2 <> ''quando si controllano le colonne di stringa vuote.
Dzhuneyt,

0

è possibile utilizzare come carattere jolly operatore per raggiungere questo obiettivo:

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

in questo modo, potresti ottenere tutti i telefoni2 che hanno un prefisso numerico.


0

Nel mio caso avevo una colonna varchar, entrambi i metodi di IS NOT NULL& != '' non funzionavano , ma quanto segue ha funzionato per me. Lo sto solo mettendo qui.

SELECT * FROM `db_name` WHERE `column_name` LIKE '%*%'
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.