Почему использование символа Underscore в LIKE-фильме дает мне все результаты?
Я написал ниже 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
Измените условие WHERE
следующим образом:
WHERE mycolumn LIKE '%\_%' ESCAPE '\'
Это один из способов поддержки Oracle escape-символов. Здесь вы определяете escape-символ с ключевым словом escape
. Подробнее см. эту ссылку в Документах Oracle.
'_'
и '%'
являются подстановочными знаками в операторе LIKE
в SQL.
Символ _
ищет наличие (любого) одного символа. Если вы выполните поиск по columnName LIKE '_abc'
, он даст результат с строками, имеющими 'aabc'
, 'xabc'
, '1abc'
, '#abc'
, но NOT 'abc'
, 'abcc'
, 'xabcd'
и т.д.
Символ '%'
используется для сопоставления 0 или более символов. Это означает, что при поиске по columnName LIKE '%abc'
он даст вам результат с 'abc'
, 'aabc'
, 'xyzabc'
и т.д., Но не 'xyzabcd'
, 'xabcdd'
и любой другой строкой, которая не заканчивается с 'abc'
.
В вашем случае вы искали '%_%'
. Это даст все строки с этим столбцом, имеющим один или несколько символов, что означает любые символы, как его значение. Вот почему вы получаете все строки, даже если в значениях столбца нет _
.
Ответ 2
Подчеркиванием является шаблон в запросе LIKE
для одного произвольного символа.
Следовательно, LIKE %_%
означает "дать мне все записи с хотя бы одним произвольным символом в этом столбце".
Вам нужно избежать символа подстановки, в sql-сервере с []
вокруг:
SELECT m.*
FROM Manager m
WHERE m.managerid LIKE '[_]%'
AND m.managername LIKE '%[_]%'
Смотрите: LIKE (Transact-SQL)
Демо
Ответ 3
Подчеркивание - это подстановочный знак для чего-то.
например
"A_%" будет искать все совпадения, которые начинаются с "А" и имеют минимум 1 дополнительный символ после этого
Ответ 4
Поскольку вы хотите специально искать подстановочный знак, вам нужно избежать этого
Это делается путем добавления предложения ESCAPE
к вашему выражению LIKE
. Символ, указанный в предложении ESCAPE
, "аннулирует" следующий символ подстановки.
Вы можете использовать любой символ, который вам нравится (просто не подстановочный знак). Большинство людей используют \
, потому что это то, что многие языки программирования также используют
Таким образом, ваш запрос приведет к:
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