これは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';
したがって、ドメインが何であるかを変更したい場合(サブドメインを無視するなど)、関数を変更するだけで、クエリはすべて機能します。ただし、その時点でインデックスを再作成する必要があると思います。
これがすべてPostgres9.1で機能することを確認しましたが、最近のバージョンと互換性があるはずです。式インデックスとsubstring()はどちらも7.x日に戻ります。