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
を使用する必要があります。これを許可する方法はありますか?
ほとんどの場合、カスタムの非決定的照合が機能し、必要なものは時々決定的であると想定すると、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に関するものもあり、主要な概念は一般的にプラットフォームと言語間で同じです。