Lista de caracteres especiais para a cláusula SQL LIKE

119

Qual é a lista completa de todos os caracteres especiais para uma cláusula LIKE do SQL (estou interessado no SQL Server, mas outros seriam bons também)?

Por exemplo

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

SQL Server :

  1. %
  2. _
  3. [especificador] Por exemplo, [az]
  4. [^ especificador]
  5. Cláusula ESCAPE Por exemplo% 30! %% 'ESCAPE'! ' irá avaliar 30% como verdadeiro
  6. 'personagens precisam ser escapados com' Ex: eles se tornam eles 'estão

MySQL:

  1. % - Qualquer sequência de zero ou mais caracteres.
  2. _ - Qualquer personagem
  3. Cláusula ESCAPE Por exemplo% 30! %% 'ESCAPE'! ' irá avaliar 30% como verdadeiro

Oráculo:

  1. % - Qualquer sequência de zero ou mais caracteres.
  2. _ - Qualquer personagem
  3. Cláusula ESCAPE Por exemplo% 30! %% 'ESCAPE'! ' irá avaliar 30% como verdadeiro

Sybase

  1. %
  2. _
  3. [especificador] Por exemplo, [az]
  4. [^ especificador]

Progresso:

  1. % - Qualquer sequência de zero ou mais caracteres.
  2. _ - Qualquer personagem

    Guia de referência aqui [PDF]

PostgreSQL:

  1. % - Qualquer sequência de zero ou mais caracteres.
  2. _ - Qualquer personagem
  3. Cláusula ESCAPE Por exemplo% 30! %% 'ESCAPE'! ' irá avaliar 30% como verdadeiro

ANSI SQL92:

  1. %
  2. _
  3. Um caractere ESCAPE apenas se especificado .

PostgreSQL também possui o SIMILAR TOoperador que adiciona o seguinte:

  1. [specifier]
  2. [^specifier]
  3. | - qualquer uma das duas alternativas
  4. * - repetição do item anterior zero ou mais vezes.
  5. + - repetição do item anterior uma ou mais vezes.
  6. () - agrupar itens

A ideia é fazer deste um Wiki comunitário que pode se tornar um "balcão único" para isso.

a_horse_with_no_name
fonte
Provavelmente vale a pena mencionar a cláusula ESCAPE. SQL Server, Oracle e MySQL oferecem suporte para isso. Não sei sobre Sybase.
Dave Webb,
Estou pensando agora que a cláusula ESCAPE é SQL padrão, então provavelmente só precisa ser mencionada uma vez
Dave Webb
Não sei se ele está implementado em todos os servidores listados (e em qualquer um que possa ser adicionado posteriormente), então estou relutante em colocá-lo em uma seção "Todo o suporte". Se você tem certeza de que todos eles têm suporte, vá em frente.
Jonathan Parker,
Não se esqueça de escapar do próprio personagem de escape ...
Christoffer Hammarström
Dois comentários. Primeiro, o Microsoft SQL vem inicialmente da Sybase, então a semelhança não é coincidência. Em segundo lugar, escapar uma aspa simples com outra não se limita a LIKE; por exemplo WHERE familyname = 'O''Toole'. Terceiro, o SIMILAR TOoperador introduz uma espécie de expressão regular híbrida, que tem seus próprios recursos (e muitos mais caracteres especiais), então provavelmente não deve ser incluída aqui. Acho que isso faz 3 comentários, mas ninguém espera a Inquisição Espanhola.
Manngo

Respostas:

22

Para SQL Server, em http://msdn.microsoft.com/en-us/library/ms179859.aspx :

  • % Qualquer string de zero ou mais caracteres.

    WHERE title LIKE '%computer%' encontra todos os títulos de livros com a palavra 'computador' em qualquer lugar no título do livro.

  • _ Qualquer personagem único.

    WHERE au_fname LIKE '_ean' encontra todos os primeiros nomes de quatro letras que terminam com ean (Dean, Sean e assim por diante).

  • [] Qualquer caractere único dentro do intervalo especificado ([af]) ou conjunto ([abcdef]).

    WHERE au_lname LIKE '[C-P]arsen'encontra sobrenomes de autores terminando com arsen e começando com qualquer caractere único entre C e P, por exemplo Carsen, Larsen, Karsen e assim por diante. Em pesquisas de intervalo, os caracteres incluídos no intervalo podem variar dependendo das regras de classificação do agrupamento.

  • [^] Qualquer caractere único fora do intervalo especificado ([^ af]) ou conjunto ([^ abcdef]).

    WHERE au_lname LIKE 'de[^l]%' todos os sobrenomes de autores começando com de e onde a letra seguinte não for l.

çağdaş
fonte
1
Eu apenas tentei e parece que você pode. Mas não é como expressões regulares => [0-9] Em vez disso, você precisa especificar cada caractere assim: [0123456789]
Çağdaş Tekin
3
Espere, não. É como o RegEx, então [0-9] também funciona. Desculpe pela confusão.
Çağdaş Tekin,
6

ANSI SQL92 :

  • %
  • _
  • um caractere ESCAPE apenas se especificado .

É decepcionante que muitos bancos de dados não sigam as regras padrão e adicionem caracteres extras ou habilitem ESCAPE incorretamente com um valor padrão '\' quando estiver ausente. Como se já não tivéssemos problemas suficientes com '\'!

É impossível escrever código independente de DBMS aqui, porque você não sabe de quais caracteres terá que escapar, e o padrão diz que você não pode escapar de coisas que não precisam ser escapadas. (Consulte a seção 8.5 / Regras Gerais / 3.a.ii.)

Obrigado SQL! gnnn

bobince
fonte
5

Você deve adicionar que precisa adicionar um extra 'para escapar de um existente' no SQL Server:

smith's -> smith's

user65628
fonte
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."
Aprendendo
fonte
0

Resposta potencial para SQL Server

Interessante, acabei de executar um teste usando LinqPad com SQL Server que deveria estar executando apenas Linq to SQL por baixo e gera a seguinte instrução SQL.

Registros. Onde (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 '~'

Portanto, ainda não testei, mas parece que potencialmente a ESCAPE '~'palavra - chave pode permitir o escape automático de uma string para uso em uma expressão semelhante.

jpierson
fonte
Eles provavelmente estão apenas usando ESCAPEporque permite o uso de dois caracteres por caractere de escape (por exemplo, %torna-se ~%) em vez de três (por exemplo, sem ESCAPE, %torna-se [%]).
binki de