Query SQL in cui il campo NON contiene $ x


132

Voglio trovare una query SQL per trovare righe in cui field1 non contiene $ x. Come posso fare questo?


Posso usare la funzione CONTAINS () (sql) per fare lo stesso controllo?
— Kate,

Risposte:


291

Che tipo di campo è questo? L'operatore IN non può essere utilizzato con un singolo campo, ma deve essere utilizzato in sottoquery o con elenchi predefiniti:

-- subquery
SELECT a FROM x WHERE x.b NOT IN (SELECT b FROM y);
-- predefined list
SELECT a FROM x WHERE x.b NOT IN (1, 2, 3, 6);

Se stai cercando una stringa, scegli l'operatore LIKE (ma sarà lento):

-- Finds all rows where a does not contain "text"
SELECT * FROM x WHERE x.a NOT LIKE '%text%';

Se lo limiti in modo tale che la stringa che stai cercando debba iniziare con quella data, può usare gli indici (se c'è un indice su quel campo) ed essere ragionevolmente veloce:

-- Finds all rows where a does not start with "text"
SELECT * FROM x WHERE x.a NOT LIKE 'text%';

1
che cos'è xb? le tue lettere sono molto confuse. Consiglio di usare la tabella o il campo.
— Whitecat,

Assicurarsi che se si utilizza una sottoquery per NOT INnessuno dei valori sarà NULL, poiché NOT IN e NULL non si combinano in modo ovvio se non si ha familiarità con la logica a tre valori. Qui useresti SELECT a FROM x WHERE x.b NOT IN (SELECT b FROM y WHERE b IS NOT NULL); Se dovessi anche escludere i valori NULL, dovresti fare questo:SELECT a FROM x WHERE x.b NOT IN (SELECT b FROM y WHERE b IS NOT NULL) AND x.b IS NOT NULL;
— Bacon Bits

17

SELECT * FROM table WHERE field1 NOT LIKE '%$x%'; (Assicurati di scappare $ x correttamente prima per evitare l'iniezione SQL)

Modifica: NOT INfa qualcosa di leggermente diverso - la tua domanda non è del tutto chiara, quindi scegli quale usare. LIKE 'xxx%'può usare un indice. LIKE '%xxx'o LIKE '%xxx%'no.


Che cosa è considerato fuggire correttamente? So che con le corde normali devi solo sfuggire ad alcune cose, ma LIKE ha alcuni caratteri extra speciali.
— Pieter Bos,
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.