2012-07-04 3 views
0

В моей таблице базы данных (whitelist_domain_data) У меня есть поля идентификаторов, URL, данныевыборка данных в Postgres на основе другой колонке предварительной обработки

Столбец 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

Schemas: ID, URL, данные

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

Если вернуться:

dailystrength.org 200 

Ques: Как спроектировать запрос для извлечения всех URLs данные, если URL имеет домен «dailystrength.org»?

+0

В чем же ваша проблема? Вы получили сообщение об ошибке? Не возвращает ли он неправильные результаты? –

+0

Как получить данные, если url имеет домен «dailystrength.org» – saravanan

+0

Что не так с 'where url like '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, но оно должно быть совместимо с любой последней версией. Индексы выражений и подстрока() возвращаются к 7.x дням.

Смежные вопросы