SQL - Ignorer la casse lors de la recherche d'une chaîne

131


J'ai les données suivantes dans une table
PriceOrderShipped
PriceOrderShippedInbound
PriceOrderShippedOutbound

En SQL, j'ai besoin d'écrire une requête qui recherche une chaîne dans une table. Lors de la recherche d'une chaîne, il doit ignorer la casse. Pour la requête SQL mentionnée ci-dessous

SELECT DISTINCT COL_NAME FROM myTable WHERE COL_NAME LIKE '%PriceOrder%' 

donne toutes les données ci-dessus, alors que

SELECT DISTINCT COL_NAME FROM myTable WHERE COL_NAME LIKE '%Priceorder%' 

ne donne pas.

Par exemple. lorsque je recherche «PriceOrder» ou «priceOrder», cela fonctionne mais «priceorder» ou «Priceorder» ne fonctionne pas. J'ai essayé avec la requête ci-dessous en utilisant COLLATE, mais cela ne fonctionne pas. Faites-moi savoir où je vais mal.

SELECT DISTINCT COL_NAME FROM myTable WHERE 
COL_NAME COLLATE latin1_general_cs LIKE '%Priceorder%'
onde de choc
la source

Réponses:

234

Utilisez quelque chose comme ça -

SELECT DISTINCT COL_NAME FROM myTable WHERE UPPER(COL_NAME) LIKE UPPER('%PriceOrder%')

ou

SELECT DISTINCT COL_NAME FROM myTable WHERE LOWER(COL_NAME) LIKE LOWER('%PriceOrder%')
Aditya Kakirde
la source
14
Je pense que vous devriez toujours comparer les chaînes en majuscules (UPPER) comme meilleure pratique. Google "turkish i"
Traubenfuchs
2
Vous souhaitez savoir si votre réponse présente un problème de performances en convertissant une valeur de colonne en UPPERou en LOWERcas, puis en utilisant la LIKErecherche?
shaijut
En fait, vous devrez comparer les variantes UPPER et LOWER car certains caractères ont des représentations différentes en majuscules mais la même représentation en minuscules. Pour les autres personnages, le contraire peut être vrai. Java mentionne spécifiquement l'alphabet géorgien comme raison de faire un toLowerCase () supplémentaire dans sa comparaison insensible à la casse.
Crusha K. Rool
1
Malheureusement, cette approche provoque une analyse complète de la table comme décrit dans ce post: alvinalexander.com/sql/… . Une recherche d'index ne peut pas être appliquée, car la colonne filtrée est modifiée par la fonction UPPER / LOWER.
Jeff S.
La définition d'un classement (avant de créer l'index) semble être la meilleure approche si les performances des requêtes avec supérieur / inférieur ne sont pas suffisantes.
Jeff S.
10

Voir cette question et réponse similaire à la recherche avec insensibilité à la casse - le serveur SQL ignore la casse dans une expression where

Essayez d'utiliser quelque chose comme:

SELECT DISTINCT COL_NAME 
FROM myTable 
WHERE COL_NAME COLLATE SQL_Latin1_General_CP1_CI_AS LIKE '%priceorder%'
Miguel-F
la source
ça ne marche pas Je reçois une requête SQL qui ne s'est pas correctement terminée avant l'assemblage
shockwave
@ Miguel-F .. cela fonctionne bien, mais en quoi cela diffère-t-il de SELECT DISTINCT COL_NAME FROM myTable WHERE COL_NAME LIKE '% priceorder%' car cela fonctionne également très bien pour moi ..
Jishant
Je conseillerais plutôt d'utiliser «SQL_Latin1_General_Cp1_CI_AS_KI_WI». Ce n'est pas sensible à la casse pour une recherche.
user8155123
9

Comme ça.

SELECT DISTINCT COL_NAME FROM myTable WHERE COL_NAME iLIKE '%Priceorder%'

Dans postgresql.

Hangk
la source
4
Cette question est taguée sql-server donc une réponse postgres n'est pas pertinente.
Liam
4

Vous devriez probablement utiliser SQL_Latin1_General_Cp1_CI_AS_KI_WIcomme collation. Celui que vous spécifiez dans votre question est explicitement sensible à la casse.

Vous pouvez voir une liste de classements ici .


la source