123 votes

Liste des caractères spéciaux pour la clause SQL LIKE

Quelle est la liste complète de tous les caractères spéciaux pour une clause LIKE SQL (je suis intéressé par SQL Server mais d'autres seraient bons aussi) ?

Par exemple

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

SQL Server :

  1. %
  2. _
  3. [spécificateur] Par exemple, [a-z].
  4. [^spécificateur]
  5. Clause ESCAPE Par exemple, %30!%%' ESCAPE '!' évalue 30% comme vrai.
  6. Les caractères ' doivent être échappés avec '. Par exemple, "ils" deviennent "ils".

MySQL :

  1. % - Toute chaîne de zéro ou plus caractères.
  2. _ - Tout caractère unique
  3. Clause ESCAPE Par exemple, %30!%%' ESCAPE '!' évalue 30% comme vrai.

Oracle :

  1. % - Toute chaîne de zéro ou plus caractères.
  2. _ - Tout caractère unique
  3. Clause ESCAPE Par exemple, %30!%%' ESCAPE '!' évalue 30% comme vrai.

Sybase

  1. %
  2. _
  3. [spécificateur] Par exemple, [a-z].
  4. [^spécificateur]

Progrès :

  1. % - Toute chaîne de zéro ou plus caractères.
  2. _ - Tout caractère unique

    Guide de référence ici [PDF]

PostgreSQL :

  1. % - Toute chaîne de zéro ou plus caractères.
  2. _ - Tout caractère unique
  3. Clause ESCAPE Par exemple, %30!%%' ESCAPE '!' évalue 30% comme vrai.

ANSI SQL92 :

  1. %
  2. _
  3. Un personnage d'ESCAPE seulement si spécifié .

PostgreSQL dispose également de la fonction SIMILAR TO qui ajoute ce qui suit :

  1. [specifier]
  2. [^specifier]
  3. | - l'une des deux possibilités suivantes
  4. * - répétition de l'élément précédent zéro fois ou plus.
  5. + - répétition de l'élément précédent une ou plusieurs fois.
  6. () - regrouper des éléments

L'idée est d'en faire un wiki communautaire qui puisse devenir un "guichet unique".

0 votes

Il est probablement utile de mentionner la clause de sauvegarde. SQL Server, Oracle et MySQL la prennent tous en charge. Je ne sais pas pour Sybase.

0 votes

Je pense maintenant que la clause ESCAPE est un standard SQL et qu'elle ne doit être mentionnée qu'une seule fois.

0 votes

Je ne suis pas sûr moi-même qu'il soit implémenté dans tous les serveurs listés (et tous ceux qui pourraient être ajoutés plus tard) donc je suis réticent à le sortir dans une section "Tout support". Si vous êtes sûr qu'ils sont tous supportés, allez-y.

23voto

çağdaş Points 10552

Pour SQL Server, à partir de http://msdn.microsoft.com/en-us/library/ms179859.aspx :

  • % Toute chaîne de zéro ou plus caractères.

    WHERE title LIKE '%computer%' trouve tous les titres de livres contenant le mot "ordinateur" dans leur titre.

  • _ Tout caractère unique.

    WHERE au_fname LIKE '_ean' trouve tous les prénoms à quatre lettres qui se terminent par ean (Dean, Sean, etc.).

  • [ ] Tout caractère unique dans la plage ([a-f]) ou le jeu ([abcdef]) spécifié.

    WHERE au_lname LIKE '[C-P]arsen' trouve les noms de famille des auteurs se terminant par arsen et commençant par n'importe quel caractère unique entre C et P, par exemple Carsen, Larsen, Karsen, etc. Dans les recherches par plage, les caractères inclus dans la plage peuvent varier en fonction des règles de tri de la collation.

  • [^] Tout caractère unique ne faisant pas partie de l'intervalle ([^a-f]) ou du jeu ([^abcdef]) spécifié.

    WHERE au_lname LIKE 'de[^l]%' tous les noms de famille d'auteurs commençant par de et où la lettre suivante n'est pas l.

1 votes

Je viens d'essayer et il semble que vous puissiez le faire. Mais ce n'est pas comme les expressions régulières => [0-9] Au lieu de cela, vous devez spécifier chaque caractère comme ceci : [0123456789]

3 votes

Attends, non. C'est comme RegEx, donc [0-9] fonctionne aussi. Désolé pour la confusion.

6voto

bobince Points 270740

ANSI SQL92 :

  • %
  • _
  • un caractère ESCAPE seulement si spécifié .

Il est décevant de constater que de nombreuses bases de données ne respectent pas les règles standard et ajoutent des caractères supplémentaires, ou activent à tort la fonction ESCAPE avec une valeur par défaut de "\" alors qu'elle est absente. Comme si nous n'avions pas déjà assez de problèmes avec '\' !

Il est impossible d'écrire du code indépendant du SGBD ici, parce que vous ne savez pas quels caractères vous allez devoir échapper, et la norme dit que vous ne pouvez pas échapper des choses qui n'ont pas besoin d'être échappées. (Voir section 8.5/Règles générales/3.a.ii.)

Merci SQL ! gnnn

5voto

Heather Points 1978

Vous devriez ajouter que vous devez ajouter un ' supplémentaire pour échapper à un ' existant dans SQL Server :

smith's -> smith''s

1voto

Learning Points 5386

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."

0voto

jpierson Points 3871

Réponse potentielle pour SQL Server

Intéressant Je viens de faire un test en utilisant LinqPad avec SQL Server, ce qui devrait être juste une exécution de Linq to SQL en dessous et cela génère l'instruction SQL suivante.

Enregistrements .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 '~'

Je ne l'ai pas encore testé mais il semble que potentiellement la ESCAPE '~' peut permettre l'échappement automatique d'une chaîne de caractères à utiliser dans une expression similaire.

0 votes

Ils sont probablement juste en train d'utiliser ESCAPE car il permet d'utiliser deux caractères par caractère échappé (par ex, % devient ~% ) au lieu de trois (par exemple, sans ESCAPE , % devient [%] ).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X