SIMILAR TO - Amazon Redshift

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

SIMILAR TO

SIMILAR TO 運算子會利用 SQL 標準規則表達式的模式,來比對字串表達式 (例如資料欄的名稱)。SQL 標準規則表達式的模式可包含一組模式比對中繼字元,其中包括 LIKE 運算子所支援的兩個字元。

SIMILAR TO 運算子只會在其模式符合整個字串時傳回 true,不像 POSIX 規則表達式,其模式可以符合字串的任何部分。

SIMILAR TO 會進行區分大小寫的比對。

注意

使用 SIMILAR TO 進行的規則表達式比對,其運算成本非常昂貴。我們建議盡可能使用 LIKE,尤其是在處理極為龐大的列數時。例如,下列的查詢在功能上相同,但相較於使用規則運算式的查詢,使用 LIKE 的查詢,其執行速度快上好幾倍:

select count(*) from event where eventname SIMILAR TO '%(Ring|Die)%'; select count(*) from event where eventname LIKE '%Ring%' OR eventname LIKE '%Die%';

語法

expression [ NOT ] SIMILAR TO pattern [ ESCAPE 'escape_char' ]

引數

運算式

有效的 UTF-8 字元表達式,例如資料欄的名稱。

SIMILAR TO

SIMILAR TO 會針對 expression 中的整個字串,進行區分大小寫的模式比對。

pattern

有效的 UTF-8 字元表達式,代表 SQL 標準規則表達式的模式。

escape_char

字元表達式,將會用來逸出模式中的中繼字元。預設值為兩個反斜線 (「\\」)。

如果模式未包含任何中繼字元,則模式只代表字串本身。

兩個字元表達式都可以是 CHAR 或 VARCHAR 資料類型。如果不同,Amazon Redshift 會將 pattern 轉換為 expression 的資料類型。

SIMILAR TO 支援下列的模式比對中繼字元:

運算子 描述
% 比對任何 0 的序列或更多字元。
_ 比對任一個單一字元。
| 表示交替 (兩種替代選項中的任一種)。
* 重複前一個項目 0 次或更多次。
+ 重複前一個項目 1 次或更多次。
? 重複前一個項目 0 次或 1 次。
{m} 重複前一個項目 m 次。
{m,} 重複前一個項目 m 次或更多次。
{m,n} 重複前一個項目至少 m 次,而且不超過 n 次。
() 括號可將多個項目分組為單一邏輯項目。
[...] 方括號表達式表示字元類別,如同在 POSIX 規則表達式中的表示分式。

範例

下表顯示範例,示範使用 SIMILAR TO 進行的模式比對:

表達式 傳回值
'abc' SIMILAR TO 'abc' True
'abc' SIMILAR TO '_b_' True
'abc' SIMILAR TO '_A_' False
'abc' SIMILAR TO '%(b|d)%' True
'abc' SIMILAR TO '(b|c)%' False
'AbcAbcdefgefg12efgefg12' SIMILAR TO '((Ab)?c)+d((efg)+(12))+' True
'aaaaaab11111xy' SIMILAR TO 'a{6}_ [0-9]{5}(x|y){2}' True
'$0.87' SIMILAR TO '$[0-9]+(.[0-9][0-9])?' True

下列範例會找出名稱中包含「E」或「H」的城市:

SELECT DISTINCT city FROM users WHERE city SIMILAR TO '%E%|%H%' ORDER BY city LIMIT 5; city ----------------- Agoura Hills Auburn Hills Benton Harbor Beverly Hills Chicago Heights

下列的範例使用預設的逸出字串 (「\\」),來搜尋包含「_」的字串:

SELECT tablename, "column" FROM pg_table_def WHERE "column" SIMILAR TO '%start\\_%' ORDER BY tablename, "column" LIMIT 5; tablename | column --------------------------+--------------------- stcs_abort_idle | idle_start_time stcs_abort_idle | txn_start_time stcs_analyze_compression | start_time stcs_auto_worker_levels | start_level stcs_auto_worker_levels | start_wlm_occupancy

下列的範例將「^」指定為逸出字元,然後使用該逸出字元來搜尋包含「_」的字串:

SELECT tablename, "column" FROM pg_table_def WHERE "column" SIMILAR TO '%start^_%' ESCAPE '^' ORDER BY tablename, "column" LIMIT 5; tablename | column --------------------------+--------------------- stcs_abort_idle | idle_start_time stcs_abort_idle | txn_start_time stcs_analyze_compression | start_time stcs_auto_worker_levels | start_level stcs_auto_worker_levels | start_wlm_occupancy