SQL-запрос, в котором поле НЕ содержит $ x


133

Я хочу найти SQL-запрос, чтобы найти строки, в которых field1 не содержит $ x. Как я могу это сделать?


Могу ли я использовать функцию CONTAINS () (sql) для такой же проверки?
Kate

Ответы:


291

Что это за поле? Оператор IN нельзя использовать с одним полем, он предназначен для использования в подзапросах или с предопределенными списками:

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

Если вы ищете строку, используйте оператор LIKE (но это будет медленным):

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

Если вы ограничите его так, чтобы строка, которую вы ищете, должна начинаться с данной строки, она может использовать индексы (если есть индекс в этом поле) и работать достаточно быстро:

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

1
что такое xb? ваши письма очень сбивают с толку. Я рекомендую использовать таблицу или поле.
Whitecat

Убедитесь, что если вы используете для NOT INэтого подзапрос , ни одно из значений не будет NULL, поскольку NOT IN и NULL не объединяются очевидным образом, если вы не знакомы с трехзначной логикой. Здесь вы должны использовать SELECT a FROM x WHERE x.b NOT IN (SELECT b FROM y WHERE b IS NOT NULL); Если вам также нужно исключить значения NULL, вам нужно будет сделать это: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%'; (Убедитесь, что вы правильно экранировали $ x заранее, чтобы избежать SQL-инъекции)

Изменить: NOT INделает что-то немного другое - ваш вопрос не совсем ясен, поэтому выберите, какой из них использовать. LIKE 'xxx%'можно использовать индекс. LIKE '%xxx'или LIKE '%xxx%'не могу.


Что считается правильным побегом? Я знаю, что с обычными строками вам нужно избежать всего нескольких вещей, но LIKE имеет некоторые дополнительные специальные символы.
Питер Бос
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.