Skip site navigation (1) Skip section navigation (2)

Re: Есть л

From: Mykola Dzham <i(at)levsha(dot)org(dot)ua>
To: vvislobokov(at)lukoilperm(dot)ru
Cc: pgsql-ru-general(at)postgresql(dot)org
Subject: Re: Есть л
Date: 2005-07-04 09:15:46
Message-ID: 20050704091544.GH4355@expo.ukrweb.net (view raw or flat)
Thread:
Lists: 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(at)jabber(dot)kiev(dot)ua

In response to

Responses

pgsql-ru-general by date

Next:From: Viktor VislobokovDate: 2005-07-04 09:33:12
Subject: Re: Есть ли та
Previous:From: Viktor VislobokovDate: 2005-07-04 09:01:57
Subject: Есть ли такая возможность

Privacy Policy | About PostgreSQL
Copyright © 1996-2014 The PostgreSQL Global Development Group