基于其他预处理列获取postgres中的数据

时间:2012-07-04 13:07:21

标签: python sql postgresql

在我的数据库表(whitelist_domain_data)中,我有字段id,url,data

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                                                              

我想获取具有相同域的行。

表:Whitelist_domain_data

架构:id,url,data

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

应该返回:

dailystrength.org   200

QUES : 如果网址具有域“dailystrength.org”,如何设计查询以获取所有网址数据?

1 个答案:

答案 0 :(得分: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天。