Есть ли такая возможность
От | Viktor Vislobokov |
---|---|
Тема | Есть ли такая возможность |
Дата | |
Msg-id | 42C8FB05.3020107@lukoilperm.ru обсуждение исходный текст |
Ответы |
Re: Есть ли та
Re: Есть л |
Список | 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 Но мне бы хотелось сравнить значение именно со списком! КАК? -- С уважением, Виктор
В списке pgsql-ru-general по дате отправления: