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
undtrim
, 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
undtrim
:Varianten der LIKE-Funktion:
Wenn Sie diesen Funktionen eine Spalte mit Spezifizierer
upper
,lower
odertrim
übergeben, tritt ein Kompilierungsfehler auf.- Nach der Änderung:
Die LIKE-Funktion beachtet die Spezifizierer
upper
,lower
undtrim
, 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
undtrim
.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');
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%';
+-------+-------+
| 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%';
+-------+-------+
| 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%';
+-------+-------+
| 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%';
Bemerkung
Wenn Sie diesen Ansatz mit der LIKE-Funktion verwenden, vergewissern Sie sich, dass weder Subjekt noch Muster eine Sortierungsspezifikation haben.
Ref.: 1535