Почему использование символа подчеркивания в подобном фильтре дает мне все результаты?
я написал ниже 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');
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