您可以使用 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 天。