SQL-Funktionen: Übergabe von Spalten mit Sortierungsspezifizierer upper, lower oder trim (Ausstehend)

Achtung

Diese Verhaltensänderung ist in Bundle 2024_02 enthalten.

Den aktuellen Status des Bundles finden Sie unter Bundle-Verlauf.

Die Sortierungsspezifizierer upper und lower konvertieren Zeichenfolgen in Groß- bzw. Kleinschreibung, bevor sie verglichen werden. Der Sortierungsspezifizierer trim entfernt erst führende und nachstehende Leerzeichen, bevor Zeichenfolgen verglichen werden.

In Fällen, in denen Sie Spalten mit diesen Spezifizierern an einige der SQL-Funktionen übergeben, ändert sich das Verhalten auf folgende Weise:

Vor der Änderung:

Die Funktion LIKE ignoriert die Spezifizierer upper, lower und trim, was zu einem Vergleich unter Berücksichtigung der Groß-/Kleinschreibung führt.

Darüber hinaus unterstützen die folgenden Funktionen keine Spalten mit den Spezifizierer upper, lower und trim:

Wenn Sie diesen Funktionen eine Spalte mit Spezifizierer upper, lower oder trim übergeben, tritt ein Kompilierungsfehler auf.

Nach der Änderung:

Die LIKE-Funktion beachtet die Spezifizierer upper, lower und trim, was zu einem Vergleich ohne Berücksichtigung der Groß-/Kleinschreibung führt.

Infolgedessen können Abfragen, die die LIKE-Funktion verwenden, zusätzliche Zeilen zurückgeben (siehe folgendes Beispiel).

Beachten Sie, dass die LIKE-Funktion keine Kombinationen mit Gebietsschemaspezifizierern (z. B. en-upper) unterstützt.

Darüber hinaus unterstützen die folgenden Funktionen jetzt Spalten mit den Spezifizierer upper, lower und trim.

  • Varianten der LIKE-Funktion:

    • LIKE ALL

    • LIKE ANY

    • ILIKE ANY

  • CONTAINS

  • ENDSWITH

  • POSITION

  • REPLACE

  • SPLIT

  • SPLIT_PART

  • STARTSWITH

Beispiel für Auswirkungen der Änderung auf die LIKE-Funktion

Wie bereits erwähnt, können Abfragen mit LIKE-Funktion zusätzliche Zeilen zurückgeben, wenn eine Spalte den Spezifizierer upper, lower oder trim hat. Angenommen, eine Tabelle hat eine Spalte mit dem Spezifizierer lower. Angenommen, der Text in der Tabelle unterscheidet sich von Fall zu Fall.

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

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

Vor der Verhaltensänderung gibt jede der folgenden Abfragen, die die LIKE-Funktion verwenden, eine Zeile mit dem Wert 'abc' zurück:

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   |
+-------+-------+

Nach der Verhaltensänderung gibt die Abfrage, die die lower-Spezifikationsspalte nicht mit der LIKE-Funktion verwendet, immer noch genau eine Zeile zurück:

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

Die Abfragen, die die Funktion COLLATE zur Angabe von lower verwenden, und die Abfragen, die eine Spalte mit lower-Spezifikation an die LIKE-Funktion übergeben, geben jedoch zwei Zeilen zurück:

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   |
+-------+-------+

Dies entspricht in etwa ILIKE. Um festzustellen, ob Sie Änderungen an diesen Abfragen erwarten sollten, können Sie in diesen Abfragen LIKE durch ILIKE ersetzen.

Beibehalten des Verhaltens von vor der Änderung

Wenn Ihre Spalten die upper-, lower- oder trim-Spezifikation verwenden und Sie das Verhalten von vor der Änderung beibehalten möchten, können Sie die Funktion COLLATE mit einer leeren Spezifikation verwenden, um anzugeben, dass die mit der Spalte verbundene upper-, lower- oder trim-Spezifikation nicht verwendet werden soll:

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

Bemerkung

Wenn Sie diesen Ansatz mit der LIKE-Funktion verwenden, vergewissern Sie sich, dass weder Subjekt noch Muster eine Sortierungsspezifikation haben.

Ref.: 1535