Як я можу уникнути квадратних дужок у пункті LIKE?


236

Я намагаюся фільтрувати елементи за допомогою збереженої процедури, використовуючи подібні. Стовпчик - варчар (15). Елементи, які я намагаюсь відфільтрувати, мають назви квадратних дужок.

Наприклад: WC[R]S123456.

Якщо я це зроблю, LIKE 'WC[R]S123456'це нічого не поверне.

Я знайшов деяку інформацію про використання ESCAPEключового слова, LIKEале не розумію, як його використовувати для обробки квадратних дужок як до звичайних рядків.

Відповіді:


328
LIKE 'WC[[]R]S123456' 

або

LIKE 'WC\[R]S123456' ESCAPE '\'

Треба працювати.


10
Ключове слово ESCAPE потрібне, якщо ви хочете використовувати спеціальний символ переходу (зворотна косою рисою дійсно є власна).
Райан Кон

2
Я виправив і іншу частину відповіді. SQL Fiddle з версією до та після
Мартін Сміт

10
Якщо комусь незрозуміло, чому потрібно зняти дужку, документація LIKE вказує, що вона використовується для узгодження одного символу в діапазоні або наборі. Наприклад, використання LIKE '[fz]oo'буде відповідати як "foo", так і "zoo".
Holistic Developer

3
Було б непогано мати обґрунтування обох у відповіді. Мені не відразу було очевидно, чому перший приклад буде працювати, поки я не прочитав відповідь від Амітеша нижче.
Дон

1
Віддайте перевагу, LIKE 'WC\[R]S123456' ESCAPE '\'оскільки вона легше читається для обслуговування.
Пожежна друїда

119

Скажімо, ви хочете відповідати буквальному its[brac]et .

Вам не потрібно уникати, ]оскільки він має особливе значення лише тоді, коли він знаходиться в парі [.

Тому втечі [достатньо для вирішення проблеми. Ви можете втекти [ , замінивши його на [[] .


7
Це було дуже корисно і найкраще відповідь.
Джаред Сол,

1
[[]виглядає дивно, але це має сенс, коли ви дивитесь на це з точки зору аналізатора. Аналізатор має специфічне правило щодо обробки символів між ними [ ]. Отже, текст its[brac]etозначає: "Знайдіть такі послідовні рядки:, its(застосуйте правило для квадратних дужок:) brac, et" . З іншого боку, its[[]brac]etозначає: "Знайдіть такі послідовні рядки:, its(застосуйте правило для квадратних дужок:) [, brac]et" .
Брайан

28

Мені потрібно було виключити імена, які почалися з підкреслення, із запиту, тому я закінчив це:

WHERE b.[name] not like '\_%' escape '\'  -- use \ as the escape character

2
Мені довелося скористатися цією версією (чітко вказавши символ "втечі") - інші відповіді тут не дали для мене правильних результатів.
MarcE


15

Ключове слово ESCAPE використовується, якщо вам потрібно шукати спеціальні символи, такі як% і _, які, як правило, є підказками. Якщо вказати ESCAPE, SQL буде шукати буквально символи% та _.

Ось хороша стаття з ще кількома прикладами

SELECT columns FROM table WHERE 
    column LIKE '%[[]SQL Server Driver]%' 

-- or 

SELECT columns FROM table WHERE 
    column LIKE '%\[SQL Server Driver]%' ESCAPE '\'

6

Якщо вам потрібно буде уникати спеціальних символів, таких як "_" (підкреслення), як це було у моєму випадку, і ви не бажаєте / не можете визначити пункт ESCAPE, ви можете додати спеціальний символ квадратними дужками "[ ' і '] ' .

Це пояснює значення "дивного" рядка "[[]" - він просто охоплює символ "[" з квадратними дужками, ефективно уникаючи його.

Мій випадок використання полягав у тому, щоб вказати назву збереженої процедури з підкресленнями в ній як критерії фільтра для Profiler. Тому я поставив рядок '% name [_] з [_] a [_] зберігається [_] процедура%' у поле TextData LIKE, і це дало мені результати простеження, яких я хотів досягти.

Ось хороший приклад з документації: LIKE (Transact-SQL) - Використання символів Wildcard як літератур


4

Відповідно до документації :

Ви можете використовувати символи підстановки, які відповідають символам як буквальні символи. Щоб використовувати символ підстановки як буквальний символ, укладіть символ підстановки в дужки.

Вам потрібно уникнути цих трьох символів %_[:

'5%'      LIKE '5[%]'      -- true
'5$'      LIKE '5[%]'      -- false
'foo_bar' LIKE 'foo[_]bar' -- true
'foo$bar' LIKE 'foo[_]bar' -- false
'foo[bar' LIKE 'foo[[]bar' -- true
'foo]bar' LIKE 'foo]bar'   -- true

1

Замість '\' або іншого символу на клавіатурі ви також можете використовувати спеціальні символи, яких немає на клавіатурі. Залежно від вашого випадку використання це може знадобитися, якщо ви не хочете, щоб введення користувача випадково використовувалося як символ виходу.


2
Я часто використовую ¬- це все ще символ клавіатури у Великобританії, але рідко використовується свідомо :) (вгорі ліворуч між Escі Tab)
Andi Mohr

Користувачі все ще можуть надсилати дані, що містять літери, яких немає на клавіатурі. Ця відповідь звучить підозріло, як пропозиція уникнути фактичного вирішення проблеми…
binki

0

Використовуйте наступне.

Для введення користувачем для пошуку таким, яким він є, використовуйте escape, оскільки він потребує наступної заміни для всіх спеціальних символів (нижче охоплює весь SQL Server).

Тут одинична цитата "" "не приймається, оскільки вона не впливає як на пункт, оскільки це питання об'єднання рядків.

"-" & "^" & "]" заміна не потрібна під час втечі "[".

String FormattedString = "UserString".Replace("ð","ðð").Replace("_", "ð_").Replace("%", "ð%").Replace("[", "ð[");

Потім у SQL Query це має бути наступним. (У параметризованому запиті рядок може бути доданий з візерунками після вищезазначеної заміни).

Для пошуку точного рядка.

like 'FormattedString' ESCAPE 'ð'

Для пошуку почніть з рядка

like '%FormattedString' ESCAPE 'ð'

Пошук закінчується рядком

like 'FormattedString%' ESCAPE 'ð'

Для пошуку містити рядок

like '%FormattedString%' ESCAPE 'ð'

тощо для інших відповідностей шаблону. Але прямий ввід користувача потрібно форматувати, як було сказано вище.


0

У цьому є проблема:

LIKE 'WC[[]R]S123456' 

і:

LIKE 'WC\[R]S123456' ESCAPE '\'

Обидва працюють для SQL Server, але не працюють для Oracle.

Здається, що немає ISO / IEC 9075 способу розпізнати шаблон, що включає ліву дужку.

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