2017-10-19 22 views
0

以下例子,我只通過表達式SIMILAR TO得到TRUE; LIKE和〜都顯示爲FALSE(我在這裏沒有工作,我猜?)而不是LIKE和〜,爲什麼只有SIMILAR TO在與正則表達式匹配時才能正常工作

由於在許多SO帖子中,SIMILAR TO不太有用,所以我想了解是否有一種方法可以通過使用LIKE或〜 。

SELECT 'thomas' SIMILAR TO '%(h|x)%' 
-- result: t 

SELECT 'thomas' LIKE '%(h|x)%' 
-- result: f 

SELECT 'thomas' ~* '%(h|x)%' 
-- result: f 
+1

'LIKE'不支持正則表達式。在[手冊](https://www.postgresql.org/docs/current/static/functions-matching.html#functions-like)中,您是否有這種印象? –

+0

*永遠不要使用'SIMILAR TO':https://stackoverflow.com/a/12459689/939860 –

回答

5

LIKE支持使用_任何單個字符和%爲任何字符序列所以這種模式匹配:

SELECT 'thomas' LIKE '%(h|x)%' 

不起作用,因爲LIKE不理解(...)用於交替分組或|,那些只是LIKE模式中的文字字符。

SIMILAR TO支持_%一樣喜歡,但增加了與(...),交替分組與|,和其他一些東西,所以這樣的:

SELECT 'thomas' SIMILAR TO '%(h|x)%' 

按預期工作。

~*使用POSIX正則表達式,從而(...)是分組和|是交替,但%只是一個百分號;這意味着,這樣的:

SELECT 'thomas' ~* '%(h|x)%' 

正在尋找由百分號的hx和他們的方式,你希望它是行不通的。

SELECT 'thomas' ~* '(h|x)' -- alternation 
SELECT 'thomas' ~* 'h|x' -- alternation without an unnecessary grouping 
SELECT 'thomas' ~* '[hx]' -- or a character class 

連接到上面的文件涵蓋了所有的這樣的:如果你使用正確的正則表達式像

~*版本將正常工作。

0

您可以使用〜*在這種情況下:

SELECT 'thomas' ~* '.*(h|x).*' 

SELECT 'thomas' ~* 'h|x' 

請記住,你應該使用正則表達式POSIX與語法〜,〜*運營商。

相關問題