web-dev-qa-db-ja.com

PostgreSQLの非決定的照合はLIKEではサポートされていません

Postgresql v12を使用しています。私はこのような照合を作成しました:

CREATE COLLATION ci (provider = icu, locale = 'tr_TR', deterministic = false);

テーブルでその照合を使用しました。

create table testtable1 (
    id serial  primary key,
    name text  COLLATE "ci"
);

そして私はサンプルデータを挿入しました:

insert into testtable1 values(3,'abc');

LIKEを使用してそのテーブルをクエリすると、次のエラーが返されます。

select name from testtable1 WHERE name LIKE '%a%'  

エラー:非決定的な照合はLIKEではサポートされていません
SQL状態:0A000

しかし、私はLIKEを使用する必要があります。これを許可する方法はありますか?

1
Banu Akkus

ほとんどの場合、カスタムの非決定的照合が機能し、必要なものは時々決定的であると想定すると、COLLATE句を介して必要なときに決定的照合を提供できます。たとえば、あなたのケースでは、次のようにtr-TR-x-icu照合を使用できます。

select name from testtable1 WHERE name LIKE '%a%' COLLATE "tr-TR-x-icu"

db <> fiddle で質問に投稿されたサンプルコードを使用して、これの動作するデモを見ることができます。

もちろん、大文字と小文字は区別されます。このためには、大文字小文字を区別するILIKE演算子を使用する必要がありますinsensitive。例えば:

select name from testtable1 WHERE name ILIKE '%A%' COLLATE "tr-TR-x-icu"

ただし、=演算子は、大文字と小文字が区別されます。これは、CREATE COLLATIONステートメントで定義された照合順序がデフォルトの機密性を変更せず、デフォルトですべての大文字と小文字が区別されるためです(つまり notバイナリ照合順序と同じ 、FYIのみ)。

"tr-TR"ロケールを使用する照合を作成するには、case-insensitive、CREATE COLLATIONステートメントでlocaleプロパティを次のように指定する必要があります。

locale = 'tr-TR-u-ks-level2'

実際の動作を確認するには、以下を参照してください。 db <> fiddle example 2

照合オプションの完全なリストについては、「 nicode Technical Standard#35:UNICODE LOCALE DATA MARKUP LANGUAGE(LDML)、PART 5:COLLATION 」を参照してください。

また、照合関連情報については 照合情報 にアクセスしてください。これは主にSQL Serverと.NETを対象としていますが、MySQLとPostgreSQLに関するものもあり、主要な概念は一般的にプラットフォームと言語間で同じです。

1
Solomon Rutzky