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


119

Який повний перелік усіх спеціальних символів для SQL (мене цікавить SQL Server, але й інші були б непогані) пункт LIKE?

Напр

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

SQL Server :

  1. %
  2. _
  3. [специфікатор] Наприклад [az]
  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. [специфікатор] Наприклад [az]
  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. () - групувати елементи разом

Ідея полягає в тому, щоб зробити це спільнотою Вікі, яка може стати для цього "єдиним списком".


Напевно, варто згадати пункт ESCAPE. Це підтримують SQL Server, Oracle та MySQL. Не знаю про Sybase.
Дейв Вебб

Я думаю, зараз пункт ESCAPE є стандартним SQL, тому, ймовірно, потрібно згадати лише один раз
Дейв Вебб

Я сам не знаю, що він реалізований на всіх перерахованих серверах (і будь-який, який може бути доданий пізніше), тому я не хочу виводити його в розділ "Вся підтримка". Якщо ви впевнені, що їх усі підтримують, тоді продовжуйте.
Джонатан Паркер

Не забудьте уникнути самого персонажа втечі ...
Крістофер Хаммарстрьом

Два коментарі. По-перше, Microsoft SQL спочатку походить із Sybase, тому подібність не є випадковою. По-друге, уникнення однієї цитати з іншою не обмежується LIKE; наприклад WHERE familyname = 'O''Toole'. По-третє, SIMILAR TOоператор вводить своєрідний гібридний регулярний вираз, який має свої особливості (та ще багато спеціальних символів), тому, ймовірно, сюди не слід включати. Я думаю, це робить 3 коментарі, але іспанську інквізицію ніхто не сподівається.
Манго

Відповіді:


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'знаходить прізвища автора, що закінчуються на арсен і починаються з будь-якого окремого символу між C і P, наприклад, Карсен, Ларсен, Карсен тощо. У пошуках діапазону символи, що входять до діапазону, можуть змінюватися залежно від правил сортування для порівняння.

  • [^] Будь-який окремий символ, що не знаходиться у визначеному діапазоні ([^ af]), або набір ([^ abcdef]).

    WHERE au_lname LIKE 'de[^l]%' всі прізвища автора, що починаються з де і де наступна літера не l.


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


5

Вам слід додати, що вам потрібно додати додаткову функцію ", щоб уникнути існування" в SQL Server:

smith's -> smith''s


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 в SQL під ним, і він генерує наступний оператор SQL.

Записи. Де (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 '~'ключове слово потенційно може призвести до автоматичного виходу рядка для використання в подібному виразі.


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