SQL 関数: upperlowertrim 照合順序指定子を持つ列の引き渡し(保留中)

注意

この動作変更は2024_02バンドルにあります。

バンドルの現在のステータスについては、 バンドル履歴 をご参照ください。

upperlower 照合順序指定子 は、文字列を比較する前に文字列を大文字または小文字に(それぞれ)変換します。 trim 照合順序指定子は、文字列を比較する前に先頭と末尾のスペースを削除します。

これらの指定子を持つ列を SQL 関数のいくつかに渡すと、以下のように動作が変わります。

変更前:

LIKE 関数は upperlowertrim 指定子を無視し、大文字小文字を区別して比較します。

また、以下の関数は upperlowertrim 指定子を持つ列をサポートしていません。

これらの関数に upperlower、または trim 指定子を持つ列を渡すと、コンパイルエラーが発生します。

変更後:

LIKE 関数は upperlowertrim 指定子を尊重し、大文字と小文字を区別せずに比較します。

その結果、 LIKE 関数を使用したクエリは、追加の行を返す可能性があります(以下の例を参照)。

LIKE 関数は、ロケール指定子(例: en-upper)との組み合わせをサポートしていないことに注意してください。

さらに、以下の関数が upperlower、および trim 指定子のある列をサポートするようになりました。

  • LIKE 関数のバリアント:

    • LIKE ALL

    • LIKE ANY

    • ILIKE ANY

  • CONTAINS

  • ENDSWITH

  • POSITION

  • REPLACE

  • SPLIT

  • SPLIT_PART

  • STARTSWITH

LIKE 関数への変更の影響例

上述したように、列が upperlower、または 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');
Copy

動作変更前は、 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%';
Copy
+-------+-------+
| COL_A | COL_B |
|-------+-------|
| abc   | abc   |
+-------+-------+

動作変更後も、LIKE 関数で lower 仕様列を使用しないクエリは1行を返します。

SELECT * FROM collated_like WHERE col_a LIKE '%b%';
Copy
+-------+-------+
| 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%';
Copy
+-------+-------+
| COL_A | COL_B |
|-------+-------|
| abc   | abc   |
| ABC   | ABC   |
+-------+-------+

これは ILIKE とほぼ等しくなります。これらのクエリに変更があるかどうかを判断するには、これらのクエリの LIKE を ILIKE に置き換えます。

変更前の動作の維持

列が upperlower、または trim 指定を使用しており、変更前の動作を保持する場合は、 COLLATE 関数を空の指定で使用して、列に関連付けられた upperlower、または trim の指定を使用しないことを示すことができます。

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

注釈

この方法を LIKE 関数で使用する場合は、サブジェクトとパターンの両方に照合順序仕様が適用されていないことを確認してください。

参照: 1535