From: | "Viktor Vislobokov" <vvislobokov(at)parma-telecom(dot)ru> |
---|---|
To: | pgsql-ru-general(at)postgresql(dot)org |
Subject: | Есть ли такая возможность |
Date: | 2005-07-04 09:01:57 |
Message-ID: | 42C8FB05.3020107@lukoilperm.ru |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-ru-general |
Привет всем.
Есть ли возможность по сетевому типу inet проверить вхождение адреса для
СПИСКА значений inet?
Т.е.
есть некий IP адрес: xxx.xxx.xxx.xxx
Есть также таблица сетей
CREATE TABLE nets_tbl (
id SERIAL PRIMARY KEY,
netname CHAR(10),
net INET UNIQUE
);
в которой забито несколько значений например:
SELECT * FROM nets_tbl;
id | name | net
----+--------+------------------
13 | perm | 195.222.128.0/19
14 | perm | 62.16.32.0/19
15 | perm | 195.42.134.0/24
Мне надо сделать запрос, который бы позволил мне сказать, входит ли IP
адрес xxx.xxx.xxx.xxx в любую из сетей, которая соответствует имени 'perm'.
Напрашивается такой вариант:
SELECT * FROM nets_tbl WHERE 'xxx.xxx.xxx.xxx' IN (SELECT net FROM
nets_tbl WHERE name='perm');
Однако, такой запрос всегда будет выдавать 0 записей, т.е. совпадения
никогда не будет, если только значение в поле net не точно такое же как
и у xxx.xxx.xxx.xxx. Это вроде бы понятно почему - надо сравнение делать
с помощью функций, предназначенных для этого типа. Ищу такую функцию и
нахожу "<<", но она работает только для единичных значений, т.е.
SELECT * FROM nets_tbl WHERE 'xxx.xxx.xxx.xxx' << (SELECT net FROM
nets_tbl WHERE id=13);
работать будет, а вот:
SELECT * FROM nets_tbl WHERE 'xxx.xxx.xxx.xxx' << (SELECT net FROM
nets_tbl WHERE name='perm');
нет, потому что:
ERROR: more than one row returned by a subquery used as an expression
Но мне бы хотелось сравнить значение именно со списком! КАК?
--
С уважением, Виктор
From | Date | Subject | |
---|---|---|---|
Next Message | Mykola Dzham | 2005-07-04 09:15:46 | Re: Есть л |
Previous Message | Denis A. Egorov | 2005-07-01 18:31:20 | Re: Dump и |