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