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


я написал ниже 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

4 81

4 ответа:

изменить WHERE условие такое:

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

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

The '_' и '%' подстановочные знаки в LIKE оператор operated в SQL.

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

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

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

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

отсюда LIKE %_% означает "дайте мне все записи по крайней мере с одним произвольным символом в этом столбце".

вы должны избежать подстановочный знак, в sql-server с [] всего:

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

посмотреть: LIKE (Transact-SQL)

демо

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

это делается путем добавления 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

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