2010-10-19 4 views
144

Comment comparez-vous les chaînes afin que la comparaison ne soit vraie que si les cas de chacune des chaînes sont égaux. Par exemple:SQL Case Sensitive String Compare

Select * from a_table where attribute = 'k' 

... retournera une ligne avec un attribut 'K'. Je ne veux pas de ce comportement.

+0

Il se peut que ce ne soit pas ce dont vous avez besoin, mais vous pouvez modifier le classement ou utiliser un classement spécifique dans votre requête. – Kane

+5

Quel produit SQL? – onedaywhen

Répondre

260
Select * from a_table where attribute = 'k' COLLATE Latin1_General_CS_AS 

L'astuce.

+1

J'utiliserais normalement Latin1_General_Bin – gbn

+3

Oui, l'approche standard consiste à utiliser un classement insensible à la casse, bien que les classements eux-mêmes soient spécifiques au fournisseur. Est-ce que votre syntaxe SQL Server est la vôtre? – onedaywhen

+0

Dans mon cas, j'ai une colonne dans ma base de données qui est sensible à la casse. J'avais besoin de le comparer à une colonne standard (CI). J'ai utilisé une variation de ce OERE Foo.Bar = (Baz.Bar COLLATE Latin1_General_CS_AS) – Hypnovirus

3

Vous pouvez définir attribute comme BINARY ou utiliser INSTR ou STRCMP pour effectuer votre recherche.

29

Vous pouvez également convertir cet attribut comme sensible à la casse en utilisant cette syntaxe:

ALTER TABLE Table1 
ALTER COLUMN Column1 VARCHAR(200) 
COLLATE SQL_Latin1_General_CP1_CS_AS 

Maintenant, votre recherche sera sensible à la casse.

Si vous voulez faire cette colonne insensible à la casse à nouveau, puis utilisez

ALTER TABLE Table1 
ALTER COLUMN Column1 VARCHAR(200) 
COLLATE SQL_Latin1_General_CP1_CI_AS 
12

Vous pouvez facilement convertir colonnes VARBINARY (Longueur max), la longueur doit être le maximum que vous attendez d'éviter défectueux comparaison, il suffit de définir la longueur de la colonne. aide de la colonne TRIM de comparer la valeur réelle, sauf l'espace a une signification et une valeur dans vos colonnes de table, Ceci est un exemple simple et comme vous pouvez le voir, je TRIM la valeur des colonnes puis convertir et comparer .:

CONVERT(VARBINARY(250),LTRIM(RTRIM(Column1))) = CONVERT(VARBINARY(250),LTRIM(RTRIM(Column2))) 

J'espère que cette aide.

+2

exactement ce que je cherchais. Une méthode simple pour effectuer une comparaison ponctuelle sensible à la casse afin de rechercher des entrées contenant des majuscules. –

10

Tout comme une autre alternative, vous pouvez utiliser HASHBYTES, quelque chose comme ceci:

SELECT * 
FROM a_table 
WHERE HASHBYTES('sha1', attribute) = HASHBYTES('sha1', 'k') 
-5

si vous utilisez le navigateur oracle sql, vous pouvez utiliser;

Select * from a_table where attribute = UPPER('k') 

si vous souhaitez renvoyer une ligne avec un attribut 'K' et 'k'. Vous pouvez utiliser;

Select * from a_table where UPPER(attribute) = UPPER('k') 
+1

Ceci est incorrect. Il retournera des lignes avec 'k' et 'K', ce qui est exactement ce que l'affiche originale ne veut pas. –

+0

@RandScullard désolé mais il devrait être comme ça pour Oracle sql. Je travaille avec oracle sql navigator – elfekz