Collation
LIKE 不支持 PostgreSQL 非確定性排序規則
我正在使用 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
運算符。例如:select name from testtable1 WHERE name ILIKE '%A%' COLLATE "tr-TR-x-icu"
但是,
=
運算符仍然區分大小寫,因為CREATE COLLATION
語句中定義的排序規則沒有改變預設的敏感性,並且預設排序規則對所有內容都敏感(這與二進制排序規則不同,僅供參考)。要創建使用“tr-TR”語言環境並且區分大小寫的排序規則,您需要
locale
在語句中指定屬性,CREATE COLLATION
如下所示:locale = 'tr-TR-u-ks-level2'
要查看實際情況,請參閱:db<>fiddle example 2
請參閱“ Unicode 技術標準 #35:UNICODE LOCALE DATA MARKUP LANGUAGE (LDML),第 5 部分:排序規則”以獲取排序規則選項的完整列表。
並且,請訪問排序規則資訊以獲取排序規則相關資訊。它主要面向 SQL Server 和 .NET,但也有一些 MySQL 和 PostgreSQL 的東西,而且跨平台和語言的關鍵概念通常是相同的。