Список специальных символов для предложения SQL LIKE

119

Каков полный список всех специальных символов для SQL (меня интересует SQL Server, но подойдут и другие) Предложение LIKE?

Например

SELECT Name FROM Person WHERE Name LIKE '%Jon%'

SQL Server :

  1. %
  2. _
  3. [спецификатор] Например [аз]
  4. [^ Спецификатор]
  5. Предложение ESCAPE Пример:% 30! %% 'ESCAPE'! ' оценит 30% как истину
  6. 'персонажей нужно экранировать с помощью' Например, они становятся ими ''

MySQL:

  1. % - Любая строка из нуля или более символов.
  2. _ - Любой одиночный персонаж
  3. Предложение ESCAPE Пример:% 30! %% 'ESCAPE'! ' оценит 30% как истину

Oracle:

  1. % - Любая строка из нуля или более символов.
  2. _ - Любой одиночный персонаж
  3. Предложение ESCAPE Пример:% 30! %% 'ESCAPE'! ' оценит 30% как истину

Sybase

  1. %
  2. _
  3. [спецификатор] Например [аз]
  4. [^ Спецификатор]

Прогресс:

  1. % - Любая строка из нуля или более символов.
  2. _ - Любой одиночный персонаж

    Справочное руководство здесь [PDF]

PostgreSQL:

  1. % - Любая строка из нуля или более символов.
  2. _ - Любой одиночный персонаж
  3. Предложение ESCAPE Пример:% 30! %% 'ESCAPE'! ' оценит 30% как истину

ANSI SQL92:

  1. %
  2. _
  3. Символ ESCAPE, только если он указан .

В PostgreSQL также есть SIMILAR TOоператор, который добавляет следующее:

  1. [specifier]
  2. [^specifier]
  3. | - любой из двух вариантов
  4. * - повторение предыдущего пункта ноль или более раз.
  5. + - повторение предыдущего пункта один или несколько раз.
  6. () - группировать предметы вместе

Идея состоит в том, чтобы сделать эту вики-страницу сообщества, которая может стать для этого «универсальным магазином».

a_horse_with_no_name
источник
Вероятно, стоит упомянуть пункт ESCAPE. SQL Server, Oracle и MySQL поддерживают это. Не знаю о Sybase.
Дэйв Уэбб
Я думаю, что теперь предложение ESCAPE является стандартным SQL, поэтому, вероятно, нужно упомянуть только один раз
Дэйв Уэбб,
Я сам не знаю, реализован ли он на всех перечисленных серверах (и на любых, которые могут быть добавлены позже), поэтому я не хочу помещать его в раздел «Вся поддержка». Если вы уверены, что все они поддерживаются, продолжайте.
Джонатан Паркер,
Не забудьте убежать от самого персонажа побега ...
Кристоффер Хаммарстрём
Два комментария. Во-первых, Microsoft SQL изначально идет от Sybase, поэтому сходство не случайно. Во-вторых, экранирование одной кавычки другой не ограничивается LIKE; например WHERE familyname = 'O''Toole'. В-третьих, SIMILAR TOоператор вводит своего рода гибридное регулярное выражение, которое имеет свои особенности (и многие другие специальные символы), поэтому, вероятно, его не следует здесь включать. Думаю, это 3 комментария, но испанской инквизиции никто не ждет.
Manngo

Ответы:

22

Для SQL Server с http://msdn.microsoft.com/en-us/library/ms179859.aspx :

  • % Любая строка из нуля или более символов.

    WHERE title LIKE '%computer%' находит все названия книг со словом «компьютер» в любом месте названия книги.

  • _ Любой одиночный символ.

    WHERE au_fname LIKE '_ean' находит все имена из четырех букв, оканчивающиеся на ean (Дин, Шон и т. д.).

  • [] Любой одиночный символ в пределах указанного диапазона ([af]) или набора ([abcdef]).

    WHERE au_lname LIKE '[C-P]arsen'находит фамилии авторов, оканчивающиеся на arsen и начинающиеся с любого символа между C и P, например Carsen, Larsen, Karsen и т. д. При поиске по диапазону символы, включенные в диапазон, могут различаться в зависимости от правил сортировки сопоставления.

  • [^] Любой отдельный символ за пределами указанного диапазона ([^ af]) или набора ([^ abcdef]).

    WHERE au_lname LIKE 'de[^l]%' все фамилии авторов начинаются с de и следующая буква не l.

оборота çağdaş
источник
1
Я просто попробовал, и похоже, ты можешь. Но это не похоже на регулярные выражения => [0-9] Вместо этого вам нужно указать каждый символ следующим образом: [0123456789]
ağdaş Tekin
3
Подожди, нет. Это похоже на RegEx, поэтому [0-9] тоже работает. Извините за путаницу.
ağdaş Tekin
6

ANSI SQL92 :

  • %
  • _
  • символ ESCAPE, только если он указан .

К сожалению, многие базы данных не придерживаются стандартных правил и не добавляют лишние символы или неправильно включают ESCAPE со значением по умолчанию '\', когда оно отсутствует. Как будто у нас еще недостаточно проблем с '\'!

Здесь невозможно написать независимый от СУБД код, потому что вы не знаете, какие символы вам нужно будет экранировать, а стандарт говорит, что вы не можете избежать того, что не нужно экранировать. (См. Раздел 8.5 / Общие правила / 3.a.ii.)

Спасибо, SQL! gnnn

bobince
источник
5

Вы должны добавить, что вам нужно добавить в SQL Server дополнительное «чтобы избежать существующего»:

кузнец -> кузнец

user65628
источник
1

Sybase:

%              : Matches any string of zero or more characters.
_              : Matches a single character.
[specifier]    : Brackets enclose ranges or sets, such as [a-f] 
                 or [abcdef].Specifier  can take two forms:

                 rangespec1-rangespec2: 
                   rangespec1 indicates the start of a range of characters.
                   - is a special character, indicating a range.
                   rangespec2 indicates the end of a range of characters.

                 set: 
                  can be composed of any discrete set of values, in any 
                  order, such as [a2bR].The range [a-f], and the 
                  sets [abcdef] and [fcbdae] return the same 
                  set of values.

                 Specifiers are case-sensitive.

[^specifier]    : A caret (^) preceding a specifier indicates 
                  non-inclusion. [^a-f] means "not in the range 
                  a-f"; [^a2bR] means "not a, 2, b, or R."
Обучение
источник
0

Возможный ответ для SQL Server

Интересно, что я только что провел тест, используя LinqPad с SQL Server, который должен просто запускать Linq to SQL внизу и генерировать следующий оператор SQL.

Записи .Where (r => r.Name.Contains ("lkjwer --_ ~ []"))

-- Region Parameters
DECLARE @p0 VarChar(1000) = '%lkjwer--~_~~~[]%'
-- EndRegion
SELECT [t0].[ID], [t0].[Name]
FROM [RECORDS] AS [t0]
WHERE [t0].[Name] LIKE @p0 ESCAPE '~'

Итак, я еще не тестировал его, но похоже, что потенциально ESCAPE '~'ключевое слово может позволить автоматическое экранирование строки для использования в подобном выражении.

jpierson
источник
Они, вероятно, просто используют, ESCAPEпотому что это позволяет использовать два символа на экранированный символ (например, %становится ~%) вместо трех (например, без ESCAPE, %становится [%]).
binki