2012-07-04 38 views
0

在我的數據庫表(whitelist_domain_data)我有域ID,網址數據基於其他預處理柱

網址列有多個URL像

 
http://www.dailystrength.org/c/Hidradenitis_Suppurativa/forum/8870995-solodyn-135-mg-works 
http://au.answers.yahoo.com/question/index?qid=20090325215905AA6UVOa 
http://navaspot.wordpress.com               

我想獲取Postgres裏的數據獲取具有相同域的行。

表:Whitelist_domain_data

架構:ID,網址數據

select regexp_matches(url,'http\:\/\/([a-z0-9\.]+)\.org') as domain, 
     count(*) 
from whitelist_domain_data 
group by domain; 

應返回:

​​

QUES: 如何設計查詢,以獲取所有網址數據,如果該網址有域名「dailystrength.org」?

+0

你的問題究竟是什麼?你有錯誤嗎?它會返回錯誤的結果嗎? –

+0

如何檢索數據,如果該網址的域名爲「dailystrength.org」 – saravanan

+0

「哪裏的網址類似」http:// dailystrength.org%' –

回答

0

你可以用substring()來做到這一點,你也可能想使用表達式索引。這裏有一個例子(我調整了正則表達式匹配的內容,我認爲你想):

CREATE TABLE whitelist_domain_data(
    id SERIAL PRIMARY KEY, 
    url TEXT NOT NULL 
); 

CREATE INDEX domain_index 
    ON whitelist_domain_data (substring(url from 'https?\:\/\/([a-z0-9\.]+)')); 

INSERT into whitelist_domain_data (url) VALUES 
    ('http://www.dailystrength.org/c/Hidradenitis_Suppurativa/forum/8870995-solodyn-135-mg-works'), 
    ('http://au.answers.yahoo.com/question/index?qid=20090325215905AA6UVOa'), 
    ('http://navaspot.wordpress.com'); 

SELECT * FROM whitelist_domain_data WHERE substring(url from 'https?\:\/\/([a-z0-9\.]+)') = 'www.dailystrength.org'; 

現在,這個查詢就可以使用索引。如果這是您計劃使用了很多的東西,你也可以考慮爲它創建一個特定的功能:

CREATE FUNCTION get_domain(text) RETURNS text 
LANGUAGE SQL 
AS $$ 
    SELECT substring($1 from 'https?\:\/\/([a-z0-9\.]+)'); 
$$; 

然後上面就變成了:

CREATE INDEX domain_index 
    ON whitelist_domain_data (get_domain(url)); 

SELECT * FROM whitelist_domain_data WHERE get_domain(url) = 'www.dailystrength.org'; 

所以,這時如果你想改變什麼一個域(忽略子域或其他),你可以改變這個功能,你的查詢仍然可以工作。不過,我認爲你必須在那個時候重新編制索引。

我檢查了這一切都適用於Postgres 9.1,但它應該與任何最新版本兼容。表達式索引和substring()都返回7.x天。