Почему использование символа подчеркивания в фильтре LIKE дает мне все результаты?


118

Я написал приведенный ниже SQL-запрос с LIKEусловием:

SELECT * FROM Manager
WHERE managerid LIKE '_%'
AND managername LIKE '%_%'

В поле LIKEя хочу найти любые %_%символы подчеркивания , но знаю, что в данных моих столбцов нет символов подчеркивания.

  • Почему запрос дает мне все записи из таблицы?

Образец данных:

create table Manager(
    id int
    ,managerid varchar(3)
    ,managername varchar(50)
    );

insert into Manager(id,managerid,managername)values(1,'A1','Mangesh');
insert into Manager(id,managerid,managername)values(2,'A2','Sagar');
insert into Manager(id,managerid,managername)values(3,'C3','Ahmad');
insert into Manager(id,managerid,managername)values(4,'A4','Mango');
insert into Manager(id,managerid,managername)values(5,'B5','Sandesh');

Sql-Fiddle


1
Приятно добавить запрос sql-fiddle, но вы всегда должны показывать запрос в SO как простой текст. В противном случае этот вопрос уязвим для гниения ссылок .
Тим Шмелтер

_ :: Заменитель одиночного персонажа
vhadalgi

Ответы:


193

Измените свое WHEREсостояние следующим образом:

WHERE mycolumn LIKE '%\_%' ESCAPE '\'

Это один из способов, которыми Oracle поддерживает escape-символы. Здесь вы определяете escape-символ с escapeключевым словом. Подробнее см. По этой ссылке в Oracle Docs .

Символы '_'и '%'являются символами подстановки в LIKEоператоре SQL.

_Персонаж ищет присутствие (любой) одного символа. Если поиск по columnName LIKE '_abc', это даст вам результат с строки , имеющие 'aabc', 'xabc', '1abc', '#abc'но НЕ 'abc', 'abcc', 'xabcd'и так далее.

Символ '%'используется для сопоставления 0 или более символов. Это означает, что если вы будете искать по columnName LIKE '%abc', это даст вам результат с наличием 'abc', 'aabc', 'xyzabc'и так далее, но нет 'xyzabcd', 'xabcdd'и любая другая строка , которая не заканчивается 'abc'.

В вашем случае вы искали '%_%'. Это даст всем строкам с этим столбцом один или несколько символов, то есть любые символы, в качестве его значения. Вот почему вы получаете все строки, даже если _в вашем столбце нет значений.


У меня такая же проблема с доступом к Db. Подскажите, пожалуйста, как я могу решить эту проблему.

Возможно, вы можете найти в Google "подстановочные знаки при доступе к базе данных". Я никогда не работал над Access, поэтому не могу вам с этим помочь. Я даже сомневаюсь, что Access поддерживает likeоператора. Мое решение будет работать в большинстве, если не во всех, базах данных.
Рачча

2
Что здесь не указано, так это то, что это также работает на SQL Server, что поначалу меня тревожило, почему OP принял ответ для Oracle SQL, когда они сами отметили вопрос для SQL Server. По крайней мере, ответ должен быть написан, в первую очередь, для изначально помеченной СУБД.
underscore_d

87

Подчеркивание - это подстановочный знак вLIKE запросе для одного произвольного символа.

Следовательно, LIKE %_%означает «дать мне все записи хотя бы с одним произвольным символом в этом столбце».

Вам нужно избежать подстановочного символа в sql-server с []примерно:

SELECT m.* 
FROM Manager m 
WHERE m.managerid    LIKE  '[_]%'
AND   m.managername  LIKE '%[_]%'

См .: LIKE (Transact-SQL)

Demo


Благодарим вас за предоставление ссылки MSDN в своем ответе. Мне было трудно найти информацию о специальном символе подчеркивания, пока я не прочитал ваш пост.
Крис Смит,

5
Это правильный ответ, поскольку пользователь указал sql-serverтег в своем вопросе, а предоставленный им SQLFiddle также обозначен как MS SQL Server 2008.
Говинд Рай,

8

Поскольку вы хотите специально искать подстановочный знак, вам нужно избежать этого

Это делается путем добавления ESCAPEпредложения к вашему LIKEвыражению. Символ, указанный в ESCAPEпредложении, «сделает недействительным» следующий подстановочный знак.

Вы можете использовать любой понравившийся символ (только не подстановочный знак). Большинство людей используют a, \потому что это то, что также используют многие языки программирования.

Таким образом, ваш запрос приведет к:

select * 
from Manager
where managerid LIKE '\_%' escape '\'
and managername like '%\_%' escape '\';

Но вы также можете использовать любой другой символ:

select * 
from Manager
where managerid LIKE '#_%' escape '#'
and managername like '%#_%' escape '#';

Вот пример SQLFiddle: http://sqlfiddle.com/#!6/63e88/4


5

Подчеркивание - это подстановочный знак для чего-то. например, 'A_%' будет искать все совпадения, которые начинаются с 'A', и после этого будет иметь минимум 1 дополнительный символ


0

Вы можете написать запрос, как показано ниже:

SELECT * FROM Manager
WHERE managerid LIKE '\_%' escape '\'
AND managername LIKE '%\_%' escape '\';

это решит вашу проблему.


Как это добавляет что-нибудь помимо принятого ответа?
Ной Бройлс,

0

Если люди ищут, как это сделать в BigQuery:

  • Знак подчеркивания «_» соответствует одному символу или байту.

  • Вы можете экранировать символы "\", "_" или "%" с помощью двух обратных косых черт. Например, "\%". Если вы используете необработанные строки, требуется только одна обратная косая черта. Например, r "\%".

WHERE mycolumn LIKE '%\\_%'

Источник: https://cloud.google.com/bigquery/docs/reference/standard-sql/operators

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.