2014-01-28 30 views
1

在開始使用XML列作爲鍵/值類型的數據持有者之後,我想知道PostgreSQL的'LIKE'和'DISTINCT'是否可以用於這些數據,我需要什麼。PostgreSQL,LIKE和DISTINCT使用XML

在上一個問題中,我發佈了example table,它也涵蓋了這些主題的需求。

所以,這樣的查詢...

SELECT myindex, xpath('/setup/node()/text()', description) FROM temp1 

給出了提取存儲的XML的所有節點的所有數據想要的結果。

"{mydatabase,127.0.0.1,john,4424}" 
"{herdatabase,127.0.0.1,saly,5432}" 

現在我嘗試在關鍵的過濾由值結果:

SELECT myindex, xpath('/setup/node()/text()', description) FROM temp1 
    WHERE (xpath('/setup/DBUSER/text()', description))::TEXT[] = '{saly}'::TEXT[]; 

並獲得預期的結果:

"{herdatabase,127.0.0.1,saly,5432}" 

1)這是問題,我不知道如何使用LIKE而不是'='。

SELECT myindex, xpath('/setup/node()/text()', description) FROM temp1 
    WHERE (xpath('/setup/DBUSER/text()', description))::TEXT[] LIKE 'aly'::TEXT[]; 

2)最好說,我想,我的「喜歡」下的所有可用數據的搜索,例如:

SELECT myindex, xpath('/setup/node()/text()', description) FROM temp1 
    WHERE (xpath('/setup/node()/text()', description))::TEXT[] LIKE 'aly'::TEXT[]; 

但也不起作用。

3)更準確地說,在現實世界中,需要使用DISTINCT標準過濾XML中的可用數據,因爲會有更多次相同的數據。就像這樣:

SELECT DISTINCT xpath('/setup/node()/text()', description) FROM temp1 
    WHERE (xpath('/setup/node()/text()', description))::TEXT[] LIKE 'aly'::TEXT[]; 

我有,但凌亂的數據和文本列的類型,並獲得更有條理的數據,我想切換到XML描述的功能了。

請幫助根據需要獲得答案。

編輯 的Postgres 9.3,此Windows 7 數據是在這裏:PostgreSQL, using xml

這是我的查詢:

SELECT LAST(myindex), LAST(description), content::text, LAST(content) 
    FROM (SELECT myindex, description, 
     (xpath('/setup/node()/text()', description)) AS content FROM temp1) AS alias 
WHERE content::text ILIKE '%127%' 
GROUP BY content::text; 

通過嘗試由自己作出查詢我看到比較好使用分組而不是分開。
它有點慢但可行。
還有一些經驗認爲,那些查詢OK?

+0

一些示例數據去查詢將很好。另外,你的PostgreSQL版本是什麼? (有沒有考慮設置一個非隨機生成的用戶名?) –

+0

這是我感興趣地連接的傳統用戶名:)當然,我給了鏈接樣本數據,希望這很清楚。鏈接指向http://stackoverflow.com/questions/21410412/postgresql-using-xml。與此同時,我解決了大部分問題,只剩下一個問題。請參閱有關EDIT的問題。 –

+0

由於早上比晚上更聰明,我解決了最後剩下的問題,現在我只需要知道我的查詢是否正確或可以寫得更好? –

回答

1

您可以使用UNNEST()將子查詢中的XML數組拆分成行,然後使用ILIKE檢查這些值。

SELECT myindex, description, content 
FROM (
    SELECT myindex, description, UNNEST(xpath('/setup/node()/text()', description))::TEXT AS content 
    FROM temp1 
    ) AS alias 
WHERE content ILIKE '%127%' 

我沒有基準,但表現應該會更好。

+0

這也是一個有趣且可行的方法,謝謝。 –

+0

實際上,這將列出所有DISTINCT行,但沒關係,使用自定義聚集'LAST'和GROUP BY我已經解決了這個問題。 –