Re: Есть л
От | Mykola Dzham |
---|---|
Тема | Re: Есть л |
Дата | |
Msg-id | 20050704091544.GH4355@expo.ukrweb.net обсуждение исходный текст |
Ответ на | Есть ли такая возможность ("Viktor Vislobokov" <vvislobokov@parma-telecom.ru>) |
Список | pgsql-ru-general |
Viktor Vislobokov wrote: > Привет всем. > Есть ли возможность по сетевому типу 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 > > Но мне бы хотелось сравнить значение именно со списком! КАК? А может это просто чрезмерное увлечение вложенными запросами? :) SELECT * FROM nets_tbl WHERE 'xxx.xxx.xxx.xxx' << net AND name='perm' ; -- Mykola Dzham, LEFT-(UANIC|RIPE) JID: levsha@jabber.kiev.ua
В списке pgsql-ru-general по дате отправления: