[英]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
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.