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.