Consulta SQL donde el campo NO contiene $ x

132

Quiero encontrar una consulta SQL para buscar filas donde field1 no contenga $ x. ¿Cómo puedo hacer esto?

zuk1
fuente
¿Puedo usar la función CONTAINS () (sql) para hacer la misma verificación?
Kate

Respuestas:

291

¿Qué tipo de campo es este? El operador IN no se puede usar con un solo campo, pero está destinado a usarse en subconsultas o con listas predefinidas:

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

Si está buscando una cadena, busque el operador LIKE (pero esto será lento):

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

Si lo restringe para que la cadena que está buscando tenga que comenzar con la cadena dada, puede usar índices (si hay un índice en ese campo) y ser razonablemente rápido:

-- Finds all rows where a does not start with "text"
SELECT * FROM x WHERE x.a NOT LIKE 'text%';
Vegard Larsen
fuente
1
que es xb Tus cartas son muy muy confusas. Recomiendo usar tabla o campo.
Whitecat
Asegúrese de que si usa una subconsulta para NOT INque ninguno de los valores sea NULL, ya que NOT IN y NULL no se combinan de manera obvia si no está familiarizado con la lógica de tres valores. Aquí usaría SELECT a FROM x WHERE x.b NOT IN (SELECT b FROM y WHERE b IS NOT NULL); Si también necesita excluir valores NULL, necesitaría hacer esto: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%'; (Asegúrese de escapar $ x correctamente de antemano para evitar la inyección de SQL)

Editar: NOT INhace algo un poco diferente: su pregunta no está totalmente clara, así que elija cuál usar. LIKE 'xxx%'puede usar un índice. LIKE '%xxx'o LIKE '%xxx%'no puedo

Greg
fuente
¿Qué se considera escapar adecuadamente? Sé que con las cuerdas normales solo tienes que escapar de algunas cosas, pero LIKE tiene algunos caracteres especiales adicionales.
Pieter Bos