2014-02-27 47 views
1

有沒有更好的方法來做到這一點?看起來愚蠢的是有兩次相同的正則表達式,但我想指出哪個短語觸發了被選中的消息內容。服務器上的Greenplum 4.2.2.4(如PostgreSQL 8.2)。SELECT和WHERE中的冗餘正則表達式

SELECT 
to_timestamp(extrainfo.startdate/1000) 
,messages.timestamp 
,users.username 
,substring(messages.content from E'(?i)phrase number one|phrase\.two|another phrase|this list keeps going|lots\.of\*keyword phrases|more will be added in the future') 
,messages.content 

FROM users 
LEFT JOIN messages ON messages.senderid = users.id 
LEFT JOIN extrainfo ON extrainfo.username = users.username 

WHERE extrainfo.type1 = 't' 
AND messages.content ~* E'phrase number one|phrase\.two|another phrase|this list keeps going|lots\.of\*keyword phrases|more will be added in the future' 
AND (extrainfo.type2 = 'f' OR extrainfo.type2 IS NULL) 
+0

難道真的PostgreSQL的8.2(古代版),或您使用的Greenplum或紅移? –

+0

在x86_64-unknown-linux-gnu上編譯的GCC gcc(GCC)編譯的版本()返回:PostgreSQL 8.2.15(Greenplum數據庫4.2.2.4版本1社區版)4.4.2編譯於2012年10月17日11:52: 28 – Travis

+0

如果您使用Greenplum,請不要說它是PostgreSQL。事實並非如此。它是Greenplum數據庫。它與真正的PostgreSQL有着非常不同的特性和功能。我爲你解決了你的問題。 –

回答

0

嘗試使用基本的加入:

SELECT 
    to_timestamp(extrainfo.startdate/1000) 
    ,messages.timestamp 
    ,users.username 
    ,substring(messages.content from rgxp.rgxp) 
    ,messages.content 
FROM users 
LEFT JOIN messages ON messages.senderid = users.id 
join ( 
    select E'(?i)phrase number one|phrase\.two|another phrase|this list keeps going|lots\.of\*keyword phrases|more will be added in the future'::text 
     as rgxp 
) rgxp 
on messages.content ~* rgxp.rgxp 
LEFT JOIN extrainfo ON extrainfo.username = users.username 
WHERE extrainfo.type1 = 't' 
AND (extrainfo.type2 = 'f' OR extrainfo.type2 IS NULL) 

這是一個演示(僅適用於一個表):http://sqlfiddle.com/#!11/4a00d/2

+0

謝謝你的建議。它似乎在某種程度上工作,但沒有完全填充子字符串列(大多數條目返回爲空)。 – Travis

+0

沒關係,我在代碼中有一個錯字。現在糾正和工作!非常感謝 :) – Travis

相關問題