Подтвердить что ты не робот

Почему использование символа 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

4b9b3361

Ответ 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