簡體   English   中英

PostgreSQL IP地址:通過inet數據搜索正確的結果?

[英]PostgreSQL IP address: Search the right result by inet data?

當詢問給定的IP地址( inet類型)是否在數據庫中搜索正確的結果時,我在PostgreSQL上遇到問題。 我將逐步提供我在做什么。

CREATE TABLE public.test (
   ip inet,
   a character varying
);
INSERT INTO public.test (ip, a) VALUES
    ('1111:0000:0101:000A:0002:0003:0004:0005', 'admin1'),
    ('1111:0001:0101:000A:0002:0003:0004:0005', 'admin2'),
    ('1111:0011:0101:000A:0002:0003:0004:0005', 'admin3'),
    ('1111:0111:0101:000A:0002:0003:0004:0005', 'admin4'),
    ('1111:1111:0101:000A:0002:0003:0004:0005', 'admin5');

然后我想通過'1111:0'搜索ip ,它應該找到結果

1111:0000:0101:000A:0002:0003:0004:0005
1111:0001:0101:000A:0002:0003:0004:0005
1111:0011:0101:000A:0002:0003:0004:0005
1111:0111:0101:000A:0002:0003:0004:0005

如果要搜索inet地址的某些文本表示形式(使用f.ex. LIKE ),將會很麻煩。 因為inet輸出是規范化的。 例如:

input                                   | output 
1111:0000:0000:0000:0000:0000:0000:0005 | 1111::5/128
1111:0001:0101:000A:0002:0003:0004:0005 | 1111:1:101:a:2:3:4:5/128

因此,前導零消失了,並且最大零個塊被::替代(在IPv6中完全有效)。

但是,如果要查找具有20個前導位(1111:0 inet地址 ,則可以使用子網

對於1111:0 ,您實際上是在尋找1111::/20的子主機(網絡/)( 包含contains運算符: >> ):

select addr,
       inet '1111::/20' >> addr  "is within '1111::/20'"
from   (values (inet '1111:0000:0000:0000:0000:0000:0000:0005'),
               (inet '1111:0001:0101:000A:0002:0003:0004:0005'),
               (inet '1111:0011:0101:000A:0002:0003:0004:0005'),
               (inet '1111:0111:0101:000A:0002:0003:0004:0005'),
               (inet '1111:1111:0101:000A:0002:0003:0004:0005'),
               (inet '1111:F111:0101:0000:0000:0000:0000:0005')) v(addr)

將產生:

addr                        | is within '1111::/20'
1111::5/128                 | t
1111:1:101:a:2:3:4:5/128    | t
1111:11:101:a:2:3:4:5/128   | t
1111:111:101:a:2:3:4:5/128  | t
1111:1111:101:a:2:3:4:5/128 | f
1111:f111:101::5/128        | f

http://rextester.com/ZFFFK28291

select * from test where 
cast((ip)as varchar) like '%a000::%'
or cast((ip)as varchar) like '%a000:_:%'
or cast((ip)as varchar) like '%a000:__:%'
or cast((ip)as varchar) like '%a000:___:%
or cast((ip)as varchar) like '%a000:_____'
or cast((ip)as varchar) like '%a000:______'
or cast((ip)as varchar) like '%a000:_______'

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM