Sql server - comparer des chaînes de caractères avec ou sans accents / majuscules

Contenu du snippet

Comment comparer 2 chaînes de caractères avec SQL Server en ignorant la casse (les majuscules et les minuscules et/ou les accents.
Nous allons utiliser le paramètre COLLATE qui permet de régler la page de code l'ordre de tri et de comparaison.

Celà fonctionne sur SQL Server 7 et 2000, quel que soit les éditions (Express et MSDE incluses)

Cette fonctionnalité s'applique aussi au LIKE qui contrairement à ce que l'on pense peut être sensible à la casse.

De quoi dépend cette sensibilité, tout simplement du paramètre que vous renseignez à l'installation du serveur. Ensuite chaque base de données peut avoir le siens, et même chaque champ texte.

Syntaxe du COLLATE :

COLLATE PageCode_Casse_Accent_Kana_Largeur

Exemple :
Latin1_General_CI_AI

PageCode est Latin1_General ==> Alphabet Latin et ordre de tri standard
Casse est CI ==> Case Insensitive : Non sensible aux minuscules / majuscules
Accent est AI ==> Accent Insensitive : Non sensible aux accents

Dans le code ci-dessous je pars du principe que votre page de code est French, remplacez là par la votre.
Vous pourrez la retrouver par cette requête (remplacez 'VotreBaseDeDonnées' par votre base de données) :

SELECT collation_name AS [Collation],
FROM master.sys.databases
WHERE name=N'VotreBaseDeDonnées'

Source / Exemple :


-- La table
IF OBJECT_ID('MaTable', 'U') IS NOT NULL
DROP TABLE MaTable
GO

CREATE TABLE MaTable
(Id int identity(1,1),
 Ch1 varchar(50),
 Ch2 varchar(50))
GO

-- Les données de test
INSERT INTO MaTable(Ch1, Ch2) VALUES ('Tête','Tete')
INSERT INTO MaTable(Ch1, Ch2) VALUES ('Tête','TeTe')
INSERT INTO MaTable(Ch1, Ch2) VALUES ('Tete','TeTe')
INSERT INTO MaTable(Ch1, Ch2) VALUES ('Tete','Tete')
GO

-- Comparaison
--    Sensible aux minuscules / majuscules et aux accents
SELECT *
FROM MaTable WHERE Ch1 = Ch2 COLLATE French_BIN

-- Comparaison
--    Sensible aux minuscules / majuscules 
SELECT *
FROM MaTable WHERE Ch1 = Ch2 COLLATE French_CS_AI

-- Comparaison
--    Sensible aux accents
SELECT *
FROM MaTable WHERE Ch1 = Ch2 COLLATE French_CI_AS

-- Comparaison
--    Non sensibles aux 2
SELECT *
FROM MaTable WHERE Ch1 = Ch2 COLLATE French_CI_AI

GO

-- Supprime la table
DROP TABLE MaTable
GO

Conclusion :


Bonnes comparaisons

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.