Lista de caracteres especiales para la cláusula LIKE de SQL


119

¿Cuál es la lista completa de todos los caracteres especiales para un SQL (estoy interesado en SQL Server pero otros también serían buenos) cláusula LIKE?

P.ej

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

Servidor SQL :

  1. %
  2. _
  3. [especificador] Por ejemplo, [az]
  4. [^ especificador]
  5. Cláusula ESCAPE Ej.% 30! %% 'ESCAPE'! ' evaluará el 30% como verdadero
  6. 'los personajes deben escapar con' Por ejemplo, se convierten en ellos '

MySQL:

  1. % - Cualquier cadena de cero o más caracteres.
  2. _ - Cualquier carácter
  3. Cláusula ESCAPE Ej.% 30! %% 'ESCAPE'! ' evaluará el 30% como verdadero

Oráculo:

  1. % - Cualquier cadena de cero o más caracteres.
  2. _ - Cualquier carácter
  3. Cláusula ESCAPE Ej.% 30! %% 'ESCAPE'! ' evaluará el 30% como verdadero

Sybase

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

Progreso:

  1. % - Cualquier cadena de cero o más caracteres.
  2. _ - Cualquier carácter

    Guía de referencia aquí [PDF]

PostgreSQL:

  1. % - Cualquier cadena de cero o más caracteres.
  2. _ - Cualquier carácter
  3. Cláusula ESCAPE Ej.% 30! %% 'ESCAPE'! ' evaluará el 30% como verdadero

ANSI SQL92:

  1. %
  2. _
  3. Un carácter ESCAPE solo si se especifica .

PostgreSQL también tiene el SIMILAR TOoperador que agrega lo siguiente:

  1. [specifier]
  2. [^specifier]
  3. | - cualquiera de las dos alternativas
  4. * - repetición del ítem anterior cero o más veces.
  5. + - repetición del ítem anterior una o más veces.
  6. () - agrupar elementos juntos

La idea es hacer de esta una Wiki comunitaria que pueda convertirse en una "ventanilla única" para esto.


Probablemente valga la pena mencionar la cláusula ESCAPE. SQL Server, Oracle y MySQL admiten esto. No sé sobre Sybase.
Dave Webb

Estoy pensando que ahora la cláusula ESCAPE es SQL estándar, por lo que probablemente solo necesite mencionarse una vez
Dave Webb

Yo mismo no sé si está implementado en todos los servidores enumerados (y cualquiera que pueda agregarse más adelante), por lo que soy reacio a sacarlo en una sección de "Todo el soporte". Si está seguro de que todos son compatibles, continúe.
Jonathan Parker

No olvides escapar del carácter de escape en sí ...
Christoffer Hammarström

Dos comentarios. En primer lugar, Microsoft SQL proviene inicialmente de Sybase, por lo que el parecido no es casual. En segundo lugar, escapar de una sola cita con otra no se limita a LIKE; por ejemplo WHERE familyname = 'O''Toole'. En tercer lugar, el SIMILAR TOoperador introduce una especie de expresión regular híbrida, que tiene sus propias características (y muchos más caracteres especiales), por lo que probablemente no debería incluirse aquí. Supongo que hace 3 comentarios, pero nadie espera la Inquisición española.
Manngo

Respuestas:


22

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

  • % Cualquier cadena de cero o más caracteres.

    WHERE title LIKE '%computer%' busca todos los títulos de libros con la palabra "computadora" en cualquier parte del título del libro.

  • _ Cualquier carácter individual.

    WHERE au_fname LIKE '_ean' busca todos los nombres de cuatro letras que terminan en ean (Dean, Sean, etc.).

  • [] Cualquier carácter individual dentro del rango especificado ([af]) o conjunto ([abcdef]).

    WHERE au_lname LIKE '[C-P]arsen'encuentra los apellidos de los autores que terminan con arsen y comienzan con cualquier carácter entre C y P, por ejemplo, Carsen, Larsen, Karsen, etc. En las búsquedas de rango, los caracteres incluidos en el rango pueden variar según las reglas de clasificación de la colación.

  • [^] Cualquier carácter individual que no esté dentro del rango especificado ([^ af]) o establecido ([^ abcdef]).

    WHERE au_lname LIKE 'de[^l]%' todos los apellidos de los autores que comienzan con de y donde la siguiente letra no es l.


1
Lo intenté y parece que puedes. Pero no es como las expresiones regulares => [0-9] En su lugar, debe especificar cada carácter de esta manera: [0123456789]
Çağdaş Tekin

3
Espera no. Es como RegEx, por lo que [0-9] también funciona. Perdón por la confusion.
Çağdaş Tekin

6

ANSI SQL92 :

  • %
  • _
  • un carácter ESCAPE solo si se especifica .

Es decepcionante que muchas bases de datos no se adhieran a las reglas estándar y agreguen caracteres adicionales, o habiliten ESCAPE incorrectamente con un valor predeterminado de '\' cuando falta. ¡Como si no tuviéramos ya suficientes problemas con '\'!

Es imposible escribir código independiente de DBMS aquí, porque no sabe qué caracteres tendrá que escapar, y el estándar dice que no puede escapar de cosas que no necesitan escapar. (Ver sección 8.5 / Reglas generales / 3.a.ii.)

¡Gracias SQL! gnnn


5

Debe agregar que debe agregar un extra 'para escapar de un existente' en 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

Respuesta potencial para SQL Server

Interesante, acabo de ejecutar una prueba usando LinqPad con SQL Server, que debería estar ejecutando Linq a SQL debajo y genera la siguiente declaración SQL.

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

Así que todavía no lo he probado, pero parece que potencialmente la ESCAPE '~'palabra clave puede permitir el escape automático de una cadena para usarla dentro de una expresión similar.


Probablemente solo estén usando ESCAPEporque permite usar dos caracteres por carácter de escape (por ejemplo, se %convierte ~%) en lugar de tres (por ejemplo, sin ESCAPE, se %convierte [%]).
binki
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.