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

119

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 bien aussi)?

Par exemple

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

Serveur SQL :

  1. %
  2. _
  3. [spécificateur] Par exemple [az]
  4. [^ spécificateur]
  5. Clause ESCAPE Exemple:% 30! %% 'ESCAPE'! ' évaluera 30% comme vrai
  6. 'les personnages doivent être échappés avec' Par exemple, ils deviennent ils 'sont

MySQL:

  1. % - Toute chaîne de zéro ou plusieurs caractères.
  2. _ - Tout caractère unique
  3. Clause ESCAPE Exemple:% 30! %% 'ESCAPE'! ' évaluera 30% comme vrai

Oracle:

  1. % - Toute chaîne de zéro ou plusieurs caractères.
  2. _ - Tout caractère unique
  3. Clause ESCAPE Exemple:% 30! %% 'ESCAPE'! ' évaluera 30% comme vrai

Sybase

  1. %
  2. _
  3. [spécificateur] Par exemple [az]
  4. [^ spécificateur]

Le progrès:

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

    Guide de référence ici [PDF]

PostgreSQL:

  1. % - Toute chaîne de zéro ou plusieurs caractères.
  2. _ - Tout caractère unique
  3. Clause ESCAPE Exemple:% 30! %% 'ESCAPE'! ' évaluera 30% comme vrai

ANSI SQL92:

  1. %
  2. _
  3. Un caractère ESCAPE uniquement s'il est spécifié .

PostgreSQL a également l' SIMILAR TOopérateur qui ajoute ce qui suit:

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

L'idée est d'en faire un Wiki communautaire qui peut devenir un "guichet unique" pour cela.

a_horse_with_no_name
la source
Il vaut probablement la peine de mentionner la clause ESCAPE. SQL Server, Oracle et MySQL le prennent tous en charge. Je ne sais pas pour Sybase.
Dave Webb
Je pense maintenant que la clause ESCAPE est du SQL standard donc n'a probablement besoin d'être mentionnée qu'une seule fois
Dave Webb
Je ne sais pas moi-même qu'il est implémenté dans tous les serveurs listés (et ceux qui pourraient être ajoutés plus tard) donc je suis réticent à le sortir dans une section "Tout support". Si vous êtes convaincu qu'ils sont tous pris en charge, allez-y.
Jonathan Parker
N'oubliez pas d'échapper au personnage d'évasion lui-même ...
Christoffer Hammarström
Deux commentaires. Premièrement, Microsoft SQL vient initialement de Sybase, donc la ressemblance n'est pas fortuite. Deuxièmement, échapper un guillemet simple par un autre n'est pas limité à LIKE; par exemple WHERE familyname = 'O''Toole'. Troisièmement, l' SIMILAR TOopérateur introduit une sorte d'expression régulière hybride, qui a ses propres caractéristiques (et beaucoup plus de caractères spéciaux), donc ne devrait probablement pas être incluse ici. Je suppose que cela fait 3 commentaires, mais personne ne s'attend à l'Inquisition espagnole.
Manngo

Réponses:

22

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

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

    WHERE title LIKE '%computer%' trouve tous les titres de livres avec le mot «ordinateur» n'importe où dans le titre du livre.

  • _ 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 spécifiée ([af]) ou dans l'ensemble ([abcdef]).

    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 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 du classement.

  • [^] Tout caractère unique hors de la plage spécifiée ([^ af]) ou de l'ensemble ([^ abcdef]).

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

çağdaş
la source
1
J'ai juste essayé et on dirait que tu peux. 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]
Çağdaş Tekin
3
Attends, non. C'est comme RegEx donc [0-9] fonctionne aussi. Désolé pour la confusion.
Çağdaş Tekin
6

ANSI SQL92 :

  • %
  • _
  • un caractère ESCAPE uniquement s'il est spécifié .

Il est décevant que de nombreuses bases de données ne respectent pas les règles standard et ajoutent des caractères supplémentaires, ou n'activent pas correctement ESCAPE avec une valeur par défaut de «\» lorsqu'il manque. 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, car 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

bobince
la source
5

Vous devez ajouter que vous devez ajouter un supplément 'pour échapper à une exécution' dans SQL Server:

smith's -> smith's

utilisateur65628
la source
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."
Apprentissage
la source
0

Réponse potentielle pour SQL Server

Intéressant Je viens de lancer un test en utilisant LinqPad avec SQL Server qui devrait simplement exécuter Linq to SQL en dessous et il 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 donc pas encore testé, mais il semble que le ESCAPE '~'mot clé puisse permettre l'échappement automatique d'une chaîne à utiliser dans une expression similaire.

jpierson
la source
Ils utilisent probablement juste ESCAPEparce que cela permet d'utiliser deux caractères par caractère échappé (par exemple, %devient ~%) au lieu de trois (par exemple, sans ESCAPE, %devient [%]).
binki