2012-06-20 15 views

回答

1

做的最簡單的辦法是使用正則表達式來準備你的字符串是在一個正則表達式。在你的字符串轉義非單詞字符應足以使之正則表達式安全的,例如:

=> select regexp_replace('. word * and µ{', E'([^\\w\\s])', E'\\\\\\1', 'g'); 
    regexp_replace 
-------------------- 
\. word \* and µ\{ 

所以這樣的事情應該在一般的工作:

where some_text ~* x || regexp_replace(some_field, E'([^\\w\\s])', E'\\\\\\1', 'g') || y 

其中xy是正則表達式的其他部分。

如果你並不需要在年底(以上即沒有y)一個正則表達式,那麼你可以使用(?q)

的都能用嵌入式期權開始:序列(?xyz)(其中xyz是一個或多個字母字符)指定影響RE其餘部分的選項。

q指:

其餘RE的是文字( 「援引」)的字符串,所有普通字符

所以,你可以使用:

where some_text ~* x || '(?q)' || some_field 

在這個有限的情況下。

+0

第一個選項正是我所期待的,謝謝! – jadams

+0

@mu有沒有其他方式可以在不轉義所有非單詞字符的情況下工作? 我有一個類似的問題,但我的字符串包含很多非字字符,我擔心如果轉義會出現奇怪的行爲。 –

+0

@JoãoAlmeida:PostgreSQL使用相當嚴格的[POSIX正則表達式](http://www.postgresql.org/docs/current/interactive/functions-matching.html#FUNCTIONS-POSIX-REGEXP),所以我想轉義'[^ \ w ]'是非常安全的,你不會無意中產生任何正則表達式,你不必擔心'('vs'\('和一些正則表達式一樣.'(?q)'方法可能是 –