SQL 関数: upper
、 lower
、 trim
照合順序指定子を持つ列の引き渡し(保留中)¶
upper
と lower
照合順序指定子 は、文字列を比較する前に文字列を大文字または小文字に(それぞれ)変換します。 trim
照合順序指定子は、文字列を比較する前に先頭と末尾のスペースを削除します。
これらの指定子を持つ列を SQL 関数のいくつかに渡すと、以下のように動作が変わります。
- 変更前:
LIKE 関数は
upper
、lower
、trim
指定子を無視し、大文字小文字を区別して比較します。また、以下の関数は
upper
、lower
、trim
指定子を持つ列をサポートしていません。LIKE 関数のバリアント:
これらの関数に
upper
、lower
、またはtrim
指定子を持つ列を渡すと、コンパイルエラーが発生します。- 変更後:
LIKE 関数は
upper
、lower
、trim
指定子を尊重し、大文字と小文字を区別せずに比較します。その結果、 LIKE 関数を使用したクエリは、追加の行を返す可能性があります(以下の例を参照)。
LIKE 関数は、ロケール指定子(例:
en-upper
)との組み合わせをサポートしていないことに注意してください。さらに、以下の関数が
upper
、lower
、およびtrim
指定子のある列をサポートするようになりました。LIKE 関数のバリアント:
LIKE ALL
LIKE ANY
ILIKE ANY
CONTAINS
ENDSWITH
POSITION
REPLACE
SPLIT
SPLIT_PART
STARTSWITH
LIKE 関数への変更の影響例¶
上述したように、列が upper
、 lower
、または trim
指定子を持つ場合、 LIKE 関数を使用したクエリは追加の行を返す可能性があります。たとえば、あるテーブルに lower
指定子を持つ列があるとします。テーブル中のテキストは大文字と小文字が異なるとします。
CREATE OR REPLACE TABLE collated_like (
col_a VARCHAR,
col_b VARCHAR COLLATE 'lower'
);
INSERT INTO collated_like VALUES ('abc', 'abc'), ('ABC','ABC');
動作変更前は、 LIKE 関数を使用する以下の各クエリが値 'abc'
を持つ1行を返します。
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 |
+-------+-------+
動作変更後も、LIKE 関数で lower
仕様列を使用しないクエリは1行を返します。
SELECT * FROM collated_like WHERE col_a LIKE '%b%';
+-------+-------+
| COL_A | COL_B |
|-------+-------|
| abc | abc |
+-------+-------+
しかし、 COLLATE 関数を使用して lower
を指定するクエリと、 lower
仕様のある列を LIKE 関数に渡すクエリは、2行を返します。
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 |
+-------+-------+
これは ILIKE とほぼ等しくなります。これらのクエリに変更があるかどうかを判断するには、これらのクエリの LIKE を ILIKE に置き換えます。
変更前の動作の維持¶
列が upper
、 lower
、または trim
指定を使用しており、変更前の動作を保持する場合は、 COLLATE 関数を空の指定で使用して、列に関連付けられた upper
、 lower
、または trim
の指定を使用しないことを示すことができます。
SELECT * FROM collated_like WHERE col_b COLLATE '' LIKE '%b%';
注釈
この方法を LIKE 関数で使用する場合は、サブジェクトとパターンの両方に照合順序仕様が適用されていないことを確認してください。
参照: 1535