Zapytanie SQL, w którym pole NIE ZAWIERA $ x

132

Chcę znaleźć zapytanie SQL, aby znaleźć wiersze, w których pole 1 nie zawiera $ x. W jaki sposób mogę to zrobić?

zuk1
źródło
Czy mogę użyć funkcji CONTAINS () (sql), aby dokonać tego samego sprawdzenia?
Kate,

Odpowiedzi:

291

Co to za dziedzina? Operator IN nie może być używany z pojedynczym polem, ale ma być używany w podzapytaniach lub z predefiniowanymi listami:

-- 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);

Jeśli szukasz ciągu, przejdź do operatora LIKE (ale będzie to powolne):

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

Jeśli ograniczysz to tak, że szukany ciąg musi zaczynać się od podanego ciągu, może używać indeksów (jeśli w tym polu jest indeks) i być w miarę szybki:

-- Finds all rows where a does not start with "text"
SELECT * FROM x WHERE x.a NOT LIKE 'text%';
Vegard Larsen
źródło
1
co to jest xb? twoje listy są bardzo zagmatwane. Zalecam użycie tabeli lub pola.
Whitecat
Upewnij się, że jeśli użyjesz podzapytania NOT IN, żadna z wartości nie będzie NULL, ponieważ NOT IN i NULL nie łączą się w oczywisty sposób, jeśli nie jesteś zaznajomiony z logiką trójwartościową. Tutaj możesz użyć SELECT a FROM x WHERE x.b NOT IN (SELECT b FROM y WHERE b IS NOT NULL); Jeśli musisz również wykluczyć wartości NULL, musisz to zrobić: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%'; (Upewnij się, że wcześniej odpowiednio zmienisz wartość $ x, aby uniknąć wstrzyknięcia SQL)

Edycja: NOT INrobi coś innego - Twoje pytanie nie jest do końca jasne, więc wybierz, którego użyć. LIKE 'xxx%'może używać indeksu. LIKE '%xxx'albo LIKE '%xxx%'nie mogę.

Greg
źródło
Co jest uważane za właściwą ucieczkę? Wiem, że przy zwykłych napisach wystarczy uciec przed kilkoma rzeczami, ale LIKE ma kilka dodatkowych znaków specjalnych.
Pieter Bos