Différence des espaces de fin dans les comparaisons de clauses SQL WHERE
Dans SQL Server, la comparaison de clauses WHERE utilisant l'opérateur = pose souvent une divergence qui peut être perplexe. Plus précisément, les espaces de fin dans les valeurs de chaîne sont ignorés lors de la comparaison. Ce comportement s'écarte de ce à quoi on pourrait s'attendre, conduisant à des résultats inattendus.
Exemple de démonstration
Considérez l'exemple suivant dans SQL Server 2008 :
SELECT '"' + ZoneReference + '"' AS QuotedZoneReference FROM Zone WHERE ZoneReference = 'WF11XU'
Cette requête récupère les données d'une table appelée « Zone », où « ZoneReference » est la colonne de clé primaire. L'exécution de la requête renverrait le résultat suivant :
"WF11XU "
Remarquez l'espace de fin ajouté à la valeur dans le résultat. Ceci malgré le fait que les critères de comparaison n'incluent aucun espace de fin.
Cause de la divergence
La divergence est due au SQL ANSI/ISO SQL- 92, en particulier la section 8.2, qui dicte la manière dont les comparaisons de chaînes avec des espaces sont gérées. Conformément à la spécification, SQL Server remplit les chaînes de caractères utilisées dans les comparaisons pour qu'elles correspondent en longueur avant d'effectuer la comparaison. Cela signifie que les espaces de fin sont automatiquement ajoutés ou supprimés pour aligner les longueurs.
Impact sur les résultats
Dans la plupart des cas, l'inclusion d'espaces de fin dans les correspondances de comparaison produit les résultats attendus. résultats. Cependant, lors de la comparaison de valeurs où les espaces de fin sont significatifs, cela peut conduire à des résultats incorrects ou inattendus. Par exemple, lors de la recherche de correspondances exactes incluant des espaces, l'espace de fin supplémentaire peut provoquer de fausses correspondances.
Résolution
Pour résoudre le problème et garantir une comparaison précise, un peut utiliser la fonction TRIM() pour supprimer tous les espaces de début ou de fin des chaînes impliquées dans la comparaison. Cela forcera une correspondance exacte sans remplissage.
Exemple de solution
SELECT '"' + TRIM(ZoneReference) + '"' AS QuotedZoneReference FROM Zone WHERE TRIM(ZoneReference) = 'WF11XU'
L'utilisation de la fonction TRIM() comme démontré garantit une correspondance exacte de la chaîne, y compris les espaces .
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!