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.