Fonctions SQL : transmission dans les colonnes qui ont le spécificateur de classement upper, lower, ou trim (en attente)

Attention

Ce changement de comportement est présent dans le bundle 2024_02.

Pour connaître le statut actuel du bundle, reportez-vous à Historique du bundle.

Les spécificateurs de classement upper `` et ``lower convertissent les chaînes en majuscules ou en minuscules (respectivement) avant que les chaînes ne soient comparées. Le spécificateur de classement trim supprime les espaces de début et de fin avant que les chaînes ne soient comparées.

Dans les cas où vous transmettez des colonnes avec ces spécificateurs à certaines des fonctions SQL, le comportement change de la manière suivante :

Avant la modification:

La fonction LIKE ignore les spécificateurs upper, lower, et trim, ce qui donne lieu à une comparaison sensible à la casse.

En outre, les fonctions suivantes ne prennent pas en charge les colonnes avec les spécificateurs upper, lower, et trim :

Si vous passez une colonne avec le spécificateur upper, lower, ou trim à ces fonctions, une erreur de compilation se produit.

Après la modification:

La fonction LIKE respecte les spécificateurs upper, lower, et trim, ce qui permet une comparaison insensible à la casse.

Par conséquent, les requêtes qui utilisent la fonction LIKE peuvent renvoyer des lignes supplémentaires (voir l’exemple ci-dessous).

Notez que la fonction LIKE ne prend pas en charge les combinaisons avec les spécificateurs locaux (par exemple, en-upper).

En outre, les fonctions suivantes prennent désormais en charge les colonnes avec les spécificateurs upper, lower, et trim.

  • Variantes de la fonction LIKE :

    • LIKE ALL

    • LIKE ANY

    • ILIKE ANY

  • CONTAINS

  • ENDSWITH

  • POSITION

  • REPLACE

  • SPLIT

  • SPLIT_PART

  • STARTSWITH

Exemple des effets de la modification sur la fonction LIKE

Comme indiqué plus haut, si une colonne possède le spécificateur upper, lower, ou trim, les requêtes utilisant la fonction LIKE peuvent renvoyer des lignes supplémentaires. Par exemple, supposons qu’une table comporte une colonne avec le spécificateur lower. Supposons que le texte de la table diffère selon les cas.

CREATE OR REPLACE TABLE collated_like (
  col_a VARCHAR,
  col_b VARCHAR COLLATE 'lower'
);

INSERT INTO collated_like VALUES ('abc', 'abc'), ('ABC','ABC');
Copy

Avant le changement de comportement, chacune des requêtes suivantes qui utilisent la fonction LIKE renvoie une ligne avec la valeur 'abc' :

SELECT * FROM collated_like WHERE col_a LIKE '%b%';

SELECT * FROM collated_like WHERE col_a COLLATE 'lower' LIKE '%b%';

SELECT * FROM collated_like WHERE col_b LIKE '%b%';
Copy
+-------+-------+
| COL_A | COL_B |
|-------+-------|
| abc   | abc   |
+-------+-------+

Après le changement de comportement, la requête qui n’utilise pas la colonne de spécification lower avec la fonction LIKE renvoie toujours une ligne :

SELECT * FROM collated_like WHERE col_a LIKE '%b%';
Copy
+-------+-------+
| COL_A | COL_B |
|-------+-------|
| abc   | abc   |
+-------+-------+

Cependant, les requêtes qui utilisent la fonction COLLATE pour spécifier lower et les requêtes qui passent une colonne avec la spécification lower à la fonction LIKE renvoient deux lignes :

SELECT * FROM collated_like WHERE col_a COLLATE 'lower' LIKE '%b%';

SELECT * FROM collated_like WHERE col_b LIKE '%b%';
Copy
+-------+-------+
| COL_A | COL_B |
|-------+-------|
| abc   | abc   |
| ABC   | ABC   |
+-------+-------+

C’est à peu près équivalent à ILIKE. Pour déterminer si vous devez vous attendre à des changements dans ces requêtes, vous pouvez remplacer LIKE par ILIKE dans ces requêtes.

Préserver le comportement avant le changement

Si vos colonnes utilisent la spécification upper, lower, ou trim et que vous souhaitez conserver le comportement avant la modification, vous pouvez utiliser la fonction COLLATE avec une spécification vide pour indiquer que la spécification upper, lower, ou trim associée à la colonne ne doit pas être utilisée :

SELECT * FROM collated_like WHERE col_b COLLATE '' LIKE '%b%';
Copy

Note

Si vous utilisez cette approche avec la fonction LIKE, assurez-vous que le sujet et le modèle ne sont pas soumis à une spécification de classement.

Réf : 1535