POSIX 運算子 - Amazon Redshift

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

POSIX 運算子

POSIX 規則運算式是指定比對模式的字元序列。如果字串是規則運算式所描述之規則集的成員,就會比對規則運算式。

POSIX 規則表達式提供了更強大的方法,來進行 LIKESIMILAR TO 運算子以外的模式比對。POSIX 規則表達式的模式可以符合字串的任何部分,不像 SIMILAR TO 運算子只在其模式符合整個字串時,才會傳回 true。

注意

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

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

語法

expression [ ! ] ~ pattern

引數

運算式

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

!

否定運算子。不符合規則運算式。

~

針對 expression 的任何子字串,進行區分大小寫的比對。

注意

~~LIKE 的同義詞。

pattern

代表規則運算式模式的字串常值。

如果模式未包含萬用字元,則模式只代表字串本身。

若要搜尋包含中繼字元 (例如「. * | ? 」等) 的字串,請使用兩個反斜線 (「 \\」) 來逸出字元。不像 SIMILAR TOLIKE,POSIX 規則表達式的語法不支援使用者定義的逸出字元。

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

所有的字元表達式都可以是 CHAR 或 VARCHAR 資料類型。如果運算式的資料類型不同,Amazon Redshift 會將其轉換為 expression 的資料類型。

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

POSIX 描述
. 比對任一個單一字元。
* 比對出現 0 次或更多次。
+ 比對出現 1 次或更多次。
? 比對出現 0 次或 1 次。
| 指定交替比對;例如,E | H 代表 EH
^ 符合 beginning-of-line 字元。
$ 符合 end-of-line 字元。
$ 比對字串結尾。
[ ] 方括號用來表示符合的清單,應符合清單中的一個表達式。插入符號 (^) 會出現在不符合清單的前面,此清單會比對除了清單中所顯示表達式以外的所有字元。
( ) 括號可將多個項目分組為單一邏輯項目。
{m} 重複前一個項目 m 次。
{m,} 重複前一個項目 m 次或更多次。
{m,n} 重複前一個項目至少 m 次,而且不超過 n 次。
[: :] 比對 POSIX 字元類別內的任何字元。在下列的字元類別中,Amazon Redshift 只支援 ASCII 字元:[:alnum:][:alpha:][:lower:][:upper:]

Amazon Redshift 支援下列的 POSIX 字元類別。

字元類別 描述
[[:alnum:]] 所有 ASCII 英數字元
[[:alpha:]] 所有 ASCII 字母字元
[[:blank:]] 所有空白字元
[[:cntrl:]] 所有控制字元 (非列印)
[[:digit:]] 所有數字位數
[[:lower:]] 所有小寫 ASCII 字母字元
[[:punct:]] 所有標點符號字元
[[:space:]] 所有空格字元 (非列印)
[[:upper:]] 所有大寫 ASCII 字母字元
[[:xdigit:]] 所有的有效十六進位字元

Amazon Redshift 在規則運算式中支援下列受到 Perl 影響的運算子。使用兩個反斜線 (「\\」) 來逸出運算子。 

運算子 描述 同等的字元類別表達式
\\d 數字字元 [[:digit:]]
\\D 非數字字元 [^[:digit:]]
\\w 字詞字元 [[:word:]]
\\W 非字詞字元 [^[:word:]]
\\s 空白字元 [[:space:]]
\\S 非空白字元 [^[:space:]]
\\b 邊界字

範例

下表顯示範例,示範使用 POSIX 運算子進行的模式比對:

表達式 傳回值
'abc' ~ 'abc' True
'abc' ~ 'a' True
'abc' ~ 'A' False
'abc' ~ '.*(b|d).*' True
'abc' ~ '(b|c).*' True
'AbcAbcdefgefg12efgefg12' ~ '((Ab)?c)+d((efg)+(12))+' True
'aaaaaab11111xy' ~ 'a{6}.[1]{5}(x|y){2}' True
'$0.87' ~ '\\$[0-9]+(\\.[0-9][0-9])?' True
'ab c' ~ '[[:space:]]' True
'ab c' ~ '\\s' True
' ' ~ '\\S' False

下列範例會找出名稱中包含 EH 的城市:

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

下列範例會找出名稱中不包含 EH 的所有城市:

SELECT DISTINCT city FROM users WHERE city !~ '.*E.*|.*H.*' ORDER BY city LIMIT 5; city ----------------- Aberdeen Abilene Ada Agat Agawam

下列的範例使用逸出字串 (「\\」) 來搜尋包含英文句點的字串。

SELECT venuename FROM venue WHERE venuename ~ '.*\\..*' ORDER BY venueid; venuename ------------------------------ St. Pete Times Forum Jobing.com Arena Hubert H. Humphrey Metrodome U.S. Cellular Field Superpages.com Center E.J. Nutter Center Bernard B. Jacobs Theatre St. James Theatre