2012-11-26 71 views
3

最近,我們從MySQL更改爲PostgreSQL。大部分的查詢已被翻譯,除了用MySQL的REGEXP'關鍵字的那些:將列數據用作正則表達式匹配的模式

MySQL (prepared statement): 
SELECT * FROM table WHERE ? REGEXP identifier; 

我們有一個「表」,和一列被稱爲「標識符」。這個'標識符'列包含實際的正則表達式模式。

因此,不是在查詢中對正則表達式模式進行「硬編碼」,而是查找模式的標識符列。

在Postgresql中,我們需要使用'〜'關鍵字而不是'REGEXP'(僅限於MySQL),但對於Postgresql,我似乎無法從列中提取模式。

我試過沒有成功以下查詢:「*」用於測試目的,我創建了多項紀錄,其中的「標識符」列中包含

SELECT * FROM table WHERE 'test' ~ "identifier"; 
ERROR: invalid regular expression: parentheses() not balanced 


SELECT * FROM table WHERE "identifier" ~ 'test'; 
-> no results 

的值(匹配一切正則表達式),但我仍然沒有得到適當的結果。

幫助非常歡迎,謝謝!

+0

爲什麼在引號中使用列名?嘗試沒有他們。 – sufleR

+0

@ sufleR這不是問題。在postgresql中使用雙引號來指定列/表/模式/函數的確切名稱... –

+0

我們需要查看您的實際正則表達式模式。請在問題中提供失敗的示例行或sqlfiddle。 –

回答

3

也許問題出在一個正則表達式字符串中? (由於錯誤字符串說)

我測試過

SELECT * 
FROM table1 t 
WHERE 'cat' ~ t.reg; 

而且它爲我工作。這是我的SQL小提琴。 http://sqlfiddle.com/#!12/f245c/3

這個問題可以用不同的正則表達式解釋。關於postgresql正則表達式的詳細信息http://www.postgresql.org/docs/current/static/functions-matching.html

UPD有關postgresql字符串的詳細信息,請參閱http://www.postgresql.org/docs/current/interactive/sql-syntax-lexical.html#SQL-SYNTAX-STRINGS。你需要這個來正確地寫正則表達式。

+0

謝謝伊戈爾,我讀過postgresql正則表達式頁面。實際的正則表達式模式應該是正確的(我使用*來測試)。我可以問你正在使用哪個版本的postgresql?因爲我測試了你的例子,它不適合我:SELECT * FROM「Table1」t WHERE'cat'〜t.reg; 錯誤:無效的正則表達式:圓括號()不平衡 – Freqo

+0

@Freqo我測試過8.3 8.4 9.1 9.2。查看SQL小提琴鏈接http://sqlfiddle.com/#!1/f245c/1(您可以選擇頁面頂部的postgresql版本) –

+0

@Freqo:您可以在sqlfiddle.com上重現您的問題,以便我們可以看到究竟發生了什麼? –