2016-10-12 33 views
0

我的客戶想要的可能性,一組數據的匹配對正則表達式的數組的數組匹配,這意味着:的Postgres對正則表達式

table: 
name | officeId (foreignkey) 
-------- 
bob | 1 
alice | 1 
alicia | 2 
walter | 2 

,他想沿着這些線路做一些事情:

讓我辦公室的所有記錄(officeId)凡有與

ANY name ~ ANY[.*ob, ali.*] 
meaning 
ANY of[alicia, walter] ~ ANY of [.*ob, ali.*] results in true 

成員,我不能獨自黯然看着辦吧:/。

編輯

真正的問題是缺少形式的原始描述:

我不能使用select disctinct officeId .. where name ~ ANY[.*ob, ali.*],因爲:

本申請,在postgres的XML列存儲的數據,這意味着我確實有(在評估xpath('/data/clients/name/text()'))::text[]後):

table: 
name    | officeId (foreignkey) 
----------------------------------------- 
[bob, alice]  | 1 
[anthony, walter] | 2 
[alicia, walter] | 3 

有問題。 「你不這樣做,那太可怕了,你爲什麼要這樣做,將它存儲爲存儲在關係數據庫中,使用基於文檔的存儲的非sql數據庫,使用json」沒有選擇。

我被這個datamodel卡住了。

+1

你能不能用'名〜或名稱〜 '阿里*。''? –

+0

'... where name〜any(array ['。* ob','ali。*'])' – Abelisto

+0

如果我能做到這一點很簡單,我會意識到我寫的並不表達核心的問題,這是之前選擇的基礎瘋狂數據模型進入項目。 - 我編輯了這個問題 – billdoor

回答

0

這看起來很可怕,但我能想到做這樣的事情的唯一方式是交叉連接和半連接的混合。在小數據集上,這可能會工作得很好。在大型數據集上,我想象交叉連接組件可能會非常困難。

檢查出來,讓我知道,如果它的作品對你的真實數據:

with patterns as (
    select unnest(array['.*ob', 'ali.*']) as pattern 
) 
select 
    o.name, o.officeid 
from 
    office o 
where exists (
    select null 
    from patterns p 
    where o.name ~ p.pattern 
) 

的半連接有助於保護你從那裏你有一個名稱,如「艾麗西亞打頭」,將滿足多個搜索病例模式會以其他方式返回每場比賽。

+0

因爲會有~10000。000條記錄我不能使用任何解決方案,不能使用索引:/ – billdoor

0

您可以將數組轉換爲文本。

SELECT * FROM workers WHERE (xpath('/data/clients/name/text()', xml_field))::text ~ ANY(ARRAY['wal','ant']); 

當把一個字符串數組轉換成文本,包含特殊字符或關鍵字組成的字符串雙引號括起來有點像{jimmy,"walter, james"}是兩個條目。當與~相匹配時,它與字符串的任何部分匹配,與LIKE不同,它與整個字符串匹配。

以下是我在我的測試數據庫做的: '* OB'

test=# select id, (xpath('/data/clients/name/text()', name))::text[] as xss, officeid from workers WHERE (xpath('/data/clients/name/text()', name))::text ~ ANY(ARRAY['wal','ant']); 
id |   xss   | officeid 
----+-------------------------+---------- 
    2 | {anthony,walter}  |  2 
    3 | {alicia,walter}   |  3 
    4 | {"walter, james"}  |  5 
    5 | {jimmy,"walter, james"} |  4 
(4 rows) 
+0

當然會工作,但有沒有辦法使這也適用於=,<, >運營商,我只看到這與LIKE或〜 – billdoor

+0

我不知道那會是什麼樣子,但也許更好的選擇是讓你定義一些使用CREATE FUNCTION的函數https://www.postgresql.org/docs/current/static/sql- createfunction.html – coladict