Чому використання символу підкреслення у фільтрі LIKE дає мені всі результати?


118

Я написав нижче 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
Приємно додати запит sql-скрипку, але ви завжди повинні показувати запит на SO як звичайний текст. В іншому випадку це питання вразливе до зв'язку гнилі .
Тім Шмелтер

_ :: Заміна одного персонажа
vhadalgi

Відповіді:


193

Змініть свій WHEREстан так:

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

Це один із способів, яким Oracle підтримує втечу символів. Тут ви визначаєте символ втечі за допомогою escapeключового слова. Докладніше див. За цим посиланням на Документи Oracle .

'_'І '%'є підстановочних в LIKEкерованому операторі в SQL.

_Персонаж шукає присутність (будь-який) одного символу. Якщо пошук по columnName LIKE '_abc', це дасть вам результат з рядка , що мають 'aabc', 'xabc', '1abc', '#abc'але НЕ 'abc', 'abcc', 'xabcd'і так далі.

'%'Символ використовується для порівняння 0 або більшу кількість символів. Це означає, що якщо ви будете шукати в columnName LIKE '%abc', це дасть вам результат з наявністю 'abc', 'aabc', 'xyzabc'і так далі, але немає 'xyzabcd', 'xabcdd'і будь-яка інша рядок , яка не закінчується 'abc'.

У вашому випадку вас шукали '%_%'. Це дасть всі рядки цього стовпця з одним або кількома символами, що означає будь-які символи, як його значення. Ось чому ви отримуєте всі рядки, навіть якщо _у стовпці немає значень.


Я зіткнувся з тією ж проблемою в доступі Db. Скажіть, будь ласка, як я можу вирішити це питання.

Можливо, ви можете скористатись Google символами "макіяжів у доступу db". Я ніколи не працював над Access, тому не можу вам у цьому допомогти. Я навіть сумніваюся, чи Access підтримує likeоператора. Моє рішення працюватиме в більшості, якщо не у всіх базах даних.
Рачча

2
Тут не зазначається, що це також працює на SQL Server - який спочатку залишив мене за те, чому ОП прийняв відповідь на Oracle SQL, коли вони самі помітили це питання для SQL Server. Принаймні, відповідь повинна бути написана, щоб в першу чергу націлити СУБД, спочатку позначені тегами.
підкреслюй_d

87

Підкреслення - це підстановка уLIKE запиті про один довільний символ.

Значить, LIKE %_%означає "дати мені всі записи з принаймні одним довільним символом у цій колонці".

Вам потрібно уникнути символу підстановки на sql-сервері з []навколо:

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

Дивіться: LIKE (Transact-SQL)

Demo


Дякуємо, що надали посилання MSDN у межах вашої відповіді. Мені важко було знайти інформацію про спеціальний символ підкреслення, поки я не прочитав ваше повідомлення.
Кріс Сміт

5
Це правильна відповідь, оскільки користувач вказав sql-serverтег у своєму запитанні, а наданий SQLFiddle також позначається як MS SQL Server 2008.
Govind Rai

8

Оскільки ви хочете спеціально шукати символи підстановки, вам потрібно уникнути цього

Це робиться, додаючи в 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


5

Підкреслення - це підстановка для чогось. наприклад, "A_%" буде шукати весь матч, який починається з "А", і матиме як мінімум 1 додатковий символ після цього


0

Ви можете написати запит так:

SELECT * FROM Manager
WHERE managerid LIKE '\_%' escape '\'
AND managername LIKE '%\_%' escape '\';

це вирішить вашу проблему.


Як це додає щось, що не відповідає прийнятій відповіді?
Ной Бройлес

0

Якщо люди шукають, як це зробити в BigQuery:

  • Підкреслення "_" відповідає одному символу чи байту.

  • Ви можете уникнути "\", "_" або "%" за допомогою двох зворотних нахилів. Наприклад, "\%". Якщо ви використовуєте необроблені рядки, потрібен лише один зворотний косий рядок. Наприклад, r "\%".

WHERE mycolumn LIKE '%\\_%'

Джерело: https://cloud.google.com/bigquery/docs/reference/standard-sql/operators

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.