2010-12-15 2 views
0

J'ai une table qui ne va pas devenir très grande et qui contient le nom d'un compte client et un pseudonyme d'utilisateur . J'importe ces informations depuis la production afin d'exécuter quelques rapports. Pour aider à la gestion du contenu de la table, j'ajoute une simple procédure stockée AddUser où je veux d'abord vérifier si le compte client /alias existe déjà dans la table.SQL LOWER (ou UPPER) vs J'aime

Puisque je veux que cette vérification soit insensible à la casse, j'ai envisagé d'utiliser LOWER ou like lors de la comparaison des valeurs.

Probablement dans ce scénario, je ne verrais pas une grande différence en ce qui concerne la performance, mais je me suis demandé s'il y avait une meilleure pratique pour ce genre de choses.

merci beaucoup!

Répondre

2

LIKE va être beaucoup plus rapide que la conversion en utilisant LOWER, en particulier le plus long le nom.

+1

Si vous utilisez 'LIKE Name%' alors oui - cela pourrait utiliser un index, s'il est présent. Si vous utilisez 'LIKE% Name%' alors certainement pas, puisque cette expression ne sera pas en mesure d'utiliser des indices si elle est présente .... –

1

Si vous utilisez SQL Server, vous pouvez utiliser une comparaison régulière (=). Sauf si vous modifiez le paramètre par défaut, les comparaisons de chaînes SQL Server ne sont pas sensibles à la casse.

+3

Cela est souvent vrai, mais ce n'est pas toujours le cas, vous devez utiliser un classement qui spécifie l'insensibilité à la casse pour que cela fonctionne. Vous pouvez trouver votre collation en exécutant 'SELECT DATABASEPROPERTYEX ('dbName', 'Collation')' qui produira des résultats quelque chose comme 'SQL_Latin1_General_CP1_CI_AS' nous indique l'avant-dernière partie de cette chaîne, CI = insensible à la casse et CS = sensible à la casse – Robb

+0

De nombreuses instances de serveur sql dans lesquelles j'ai travaillé ont été définies en fonction de la casse. Pour être sûr, j'aimerais connaître une meilleure pratique s'il y en a une. On dirait que je peux définir un autre classement sur la requête quel que soit le paramètre actuel. – earthling

2

L'instance de base de données est-elle définie sur un classement sensible à la casse pour les chaînes? Sinon, rien de tout cela n'est nécessaire car toutes les comparaisons seront insensibles à la casse.

Voir ici: SQL server ignore case in a where expression

+0

cool, donc peu importe, je peux toujours fournir un autre classement. – earthling

+0

Oui, mais de manière générale, la plupart des instances de SQL Server ne sont pas sensibles à la casse, vous n'aurez donc généralement pas à vous en soucier. – Joe

+1

@Joe, jusqu'à ce que vous deviez. Par exemple, postgres est toujours sensible à la casse. MySQL est sensible à la casse sur Linux et insensible à la casse sur Windows. – treaz

2

lower(name) = 'Somename' n'utilisera un indice, alors que name like 'some%' pourrait.

Questions connexes