本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
POSIX 運算子
POSIX 規則運算式是指定比對模式的字元序列。如果字串是規則運算式所描述之規則集的成員,就會比對規則運算式。
POSIX 規則表達式提供了更強大的方法,來進行 LIKE 和 SIMILAR 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 TO
和 LIKE
,POSIX 規則表達式的語法不支援使用者定義的逸出字元。
兩個字元表達式都可以是 CHAR 或 VARCHAR 資料類型。如果不同,Amazon Redshift 會將 pattern 轉換為 expression 的資料類型。
所有的字元表達式都可以是 CHAR 或 VARCHAR 資料類型。如果運算式的資料類型不同,Amazon Redshift 會將其轉換為 expression 的資料類型。
POSIX 模式比對支援下列的中繼字元:
POSIX | 描述 |
---|---|
. | 比對任一個單一字元。 |
* |
比對出現 0 次或更多次。 |
+ |
比對出現 1 次或更多次。 |
? |
比對出現 0 次或 1 次。 |
| |
指定交替比對;例如, 代表 E 或 H 。 |
^ |
符合 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 |
下列範例會找出名稱中包含 E
或 H
的城市:
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
下列範例會找出名稱中不包含 E
或 H
的所有城市:
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