MySQL seleziona dove la colonna non è vuota

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 provando a selezionare solo le righe in cui il telefono inizia con 813 e phone2 ha qualcosa in esso.

Confronta il valore di phone2 con una stringa vuota:

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

Notare che il valore NULL è interpretato come false .

Per verificare se il campo è NULL, usa IS NULL , IS NOT NULL operatori IS NOT NULL .

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

Verifica la presenza di valori stringa NULL e vuoti:

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

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

Se ci sono spazi nel campo phone2 dall’inserimento accidentale di dati, è ansible ignorare quei record con le funzioni IFNULL e TRIM:

 SELECT phone, phone2 FROM jewishyellow.users WHERE phone LIKE '813%' AND TRIM(IFNULL(phone2,'')) <> ''; 
 select phone, phone2 from jewishyellow.users where phone like '813%' and phone2 is not null 

Una risposta che ho usato ha funzionato per me abbastanza bene che non ho 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 > '' 

Si noti la parte > '' , che controllerà se il valore non è nullo e se il valore non è solo bianco o vuoto.

Fondamentalmente, se il campo ha qualcosa in esso diverso da spazio bianco o NULL , è vero. È anche molto breve, quindi è facile da scrivere, e un altro vantaggio rispetto alle COALESCE() e IFNULL() è che si tratta di un indice, dal momento che non stai confrontando l’output di una funzione su un campo con qualcosa.

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 

AGGIORNARE 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 di NON FARE QUESTO , mi ha morso molto di recente ed è stato molto difficile eseguire il debug 🙁

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

Potrebbe essere necessario qualche tweakage a seconda del valore predefinito. Se hai permesso il riempimento Null, allora puoi fare “Not NULL”, che è ovviamente meglio.

Possiamo usare CASE per impostare il 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%' 

Uso:

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

puoi usare come jolly operatore per ottenere ciò:

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

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