网络地址函数和操作符
网络地址函数和操作符¶
cidr
和inet
操作符¶
下文展示了可以用于cidr
和inet
类型的操作符。 操作符<<
、<<=
、 >>
、>>=
和 &&
测试用于子网包含。它们只考虑两个地址的网络部分(忽略任何主机部分),然后判断其中一个网络部分是等于另外一个或者是 另外一个的子网。
<
¶
- 描述
- 小于
- 示例
- ``` sql
seaboxsql=# select inet '192.168.1.5' < inet '192.168.1.6' ;
?column?
t (1 row) ```
<=
¶
- 描述
- 小于等于
- 示例
- ``` sql
seaboxsql=# select inet '192.168.1.5' <= inet '192.168.1.5';
?column?
t (1 row) ```
=
¶
- 描述
- 等于
- 示例
- ``` sql
seaboxsql=# select inet '192.168.1.5' = inet '192.168.1.5';
?column?
t (1 row) ```
>=
¶
- 描述
- 大于等于
- 示例
- ``` sql
seaboxsql=# select inet '192.168.1.5' >= inet '192.168.1.5';
?column?
t (1 row) ```
>
¶
- 描述
- 大于
- 示例
- ``` sql
seaboxsql=# select inet '192.168.1.5' > inet '192.168.1.4';
?column?
t (1 row) ```
<>
¶
- 描述
- 不等于
- 示例
- ``` sql
seaboxsql=# select inet '192.168.1.5' <> inet '192.168.1.4';
?column?
t (1 row) ```
<<
¶
- 描述
- 被包含在内
- 示例
- ``` sql
seaboxsql=# select inet '192.168.1.5' << inet '192.168.1/24';
?column?
t (1 row) ```
<<=
¶
- 描述
-
- 被包含在内或等于
- 示例
- ``` sql
seaboxsql=# select inet '192.168.1/24' <<= inet '192.168.1/24';
?column?
t (1 row) ```
>>
¶
- 描述
- 包含
- 示例
- ``` sql
seaboxsql=# select inet '192.168.1/24' >> inet '192.168.1.5';
?column?
t (1 row) ```
>>=
¶
- 描述
- 包含或等于
- 示例
- ``` sql
seaboxsql=# select inet '192.168.1/24' >>= inet '192.168.1/24';
?column?
t (1 row) ```
&&
¶
- 描述
- 包含或者被包含contains or is contained by
- 示例
- ``` sql
seaboxsql=# select inet '192.168.1/24' && inet '192.168.1.80/28';
?column?
t (1 row) ```
~
¶
- 描述
- 按位 NOT
- 示例
- ``` sql
seaboxsql=# select ~ inet '192.168.1.6';
?column?
63.87.254.249 (1 row) ```
&
¶
- 描述
- 按位 AND
- 示例
- ``` sql
seaboxsql=# select inet '192.168.1.6' & inet '0.0.0.255';
?column?
0.0.0.6 (1 row) ```
|
¶
- 描述
- 按位 OR
- 示例
- ``` sql
seaboxsql=# select inet '192.168.1.6' | inet '0.0.0.255';
?column?
192.168.1.255 (1 row) ```
+
¶
- 描述
-
- 加
- 示例
- ``` sql
seaboxsql=# select inet '192.168.1.6' + 25;
?column?
192.168.1.31 (1 row) ```
-
¶
- 描述
- 减
- 示例
-
``` sql seaboxsql=# select inet '192.168.1.43' - 36; ?column?
192.168.1.7 (1 row)seaboxsql=# select inet '192.168.1.43' - inet '192.168.1.19'; ?column?
24
(1 row) ```
cidr
和inet
函数¶
下文展示了所有可以用于cidr
和inet
类型的函数。函数abbrev
、host
和text
主要是为了提供可选的显示格式用的。
abbrev()
¶
- 语法
abbrev(inet/cidr)
- 返回类型
text
- 描述
- 缩写显示格式文本
- 示例
-
``` sql seaboxsql=# select abbrev(inet '10.1.0.0/16'); abbrev
10.1.0.0/16 (1 row)seaboxsql=# select abbrev(cidr '10.1.0.0/16'); abbrev
10.1/16 (1 row) ```
broadcast()
¶
- 语法
broadcast(inet)
- 返回类型
inet
- 描述
- 网络广播地址
- 示例
- ``` sql
seaboxsql=# select broadcast('192.168.1.5/24');
broadcast
192.168.1.255/24 (1 row) ```
family()
¶
- 语法
family(inet)
- 返回类型
int
- 描述
- 抽取地址族;
4
为 IPv4,6
为 IPv6 - 示例
- ``` sql
seaboxsql=# select family('::1');
family
6 (1 row) ```
host()
¶
- 语法
host(inet)
- 返回类型
text
- 描述
- 抽取 IP 地址为文本
- 示例
- ``` sql
seaboxsql=# select host('192.168.1.5/24');
host
192.168.1.5 (1 row) ```
hostmask()
¶
- 语法
hostmask(inet)
- 返回类型
inet
- 描述
- 为网络构造主机掩码
- 示例
- ``` sql
seaboxsql=# select hostmask('192.168.23.20/30');
hostmask
0.0.0.3 (1 row) ```
masklen()
¶
- 语法
masklen(inet)
- 返回类型
int
- 描述
- 抽取网络掩码长度
- 示例
- ``` sql
seaboxsql=# select masklen('192.168.1.5/24');
masklen
24 (1 row) ```
netmask()
¶
- 语法
netmask(inet)
- 返回类型
inet
- 描述
- 为网络构造网络掩码
- 示例
- ``` sql
select netmask('192.168.1.5/24');
netmask
255.255.255.0 (1 row) ```
network()
¶
- 语法
network(inet)
- 返回类型
cidr
- 描述
- 抽取地址的网络部分
- 示例
- ``` sql
seaboxsql=# select network('192.168.1.5/24');
network
192.168.1.0/24 (1 row) ```
set_masklen()
¶
- 语法
set_masklen(inet/cidr,int)
- 返回类型
inet
- 描述
- 为
inet
或者cidr
值值设置网络掩码长度 - 示例
-
``` sql seaboxsql=# select set_masklen('192.168.1.5/24', 16); set_masklen
192.168.1.5/16 (1 row)seaboxsql=# select set_masklen('192.168.1.0/24'::cidr, 16); set_masklen
192.168.0.0/16 (1 row) ```
text()
¶
- 语法
text(inet)
- 返回类型
text
- 描述
- 抽取 IP 地址和网络掩码长度为文本
- 示例
- ``` sql
seaboxsql=# select text(inet '192.168.1.5');
text
192.168.1.5/32 (1 row) ```
inet_same_family()
¶
- 语法
inet_same_family(inet,inet)
- 返回类型
boolean
- 描述
- 地址是来自于同一个家族吗?
- 示例
- ``` sql
seaboxsql=# select inet_same_family('192.168.1.5/24', '::1');
inet_same_family
f (1 row) ```
inet_merge()
¶
- 语法
inet_merge(inet, inet)
- 返回类型
cidr
- 描述
- 包括给定网络的最小网络
- 示例
- ``` sql
seaboxsql=# select inet_merge('192.168.1.5/24', '192.168.2.5/24');
inet_merge
192.168.0.0/22 (1 row) ``` - 注意
- 任何
cidr
值都能够被隐式或显式地转换为inet
值,因此上述能够操作inet
值的函数也同样能够操作cidr
值(也有独立的用于inet
和cidr
的函数,因为它的行为应当和这两种情况不同)。inet
值也可以转换为cidr
值。完成时,该网络掩码右侧的任何位都将无声地转换为零以获得一个有效的cidr
值。另外,你还可以使用常规的造型语法将一个文本字符串转换为inet
或cidr
值:例如,inet(expression
)或colname
::cidr。
macaddr/macaddr8
函数¶
macaddr/macaddr8
类型支持标准关系操作符 (>
、<=
等) 用于编辑次序,并且按位算术操作符(~
、&
和|
)用于NOT、AND 和 OR。
下文展示了可以用于macaddr/macaddr8
类型的函数。
trunc()
¶
- 语法
trunc(macaddr/macaddr8)
- 返回类型
macaddr/macaddr8
- 描述
- 参数为
macaddr
时返回一个 MAC 地址,该地址的最后三个字节设置为零;参数为macaddr8
时返回一个后五个字节设置为零的MAC地址。这可以被用来为一个制造商关联一个前缀。 - 示例
-
``` sql seaboxsql=# select trunc(macaddr '12:34:56:78:90:ab'); trunc
12:34:56:00:00:00 (1 row)seaboxsql=# select trunc(macaddr8 '12:34:56:78:90
cd:ef'); trunc
12:34:56:00:00:00:00:00 (1 row) ```
macaddr8_set7bit()
¶
- 语法
macaddr8_set7bit(macaddr8)
- 返回类型
macaddr8
- 描述
- 设置第7位为一,也被称为修改版的EUI-64,用于内含在IPv6地址中
- 示例
- ``` sql
seaboxsql=# select macaddr8_set7bit(macaddr8 '00:34:56
cd:ef'); macaddr8_set7bit
02:34:56:ff:fecd:ef (1 row) ```