我想找到一种方法来执行SQL查询,该查询将计算存储在数据库中的子网掩码的cidr(位表示).例如,我有255.255.255.0或其十进制值(4294967040)存储在数据库中.我想通过查询进行选择并返回/ 24表示.
我做了以下的事情来确定子网的最后一个IP,所以我希望做类似的事情来确定一个掩码的cidr表示.
select concat(inet_ntoa(ip_addr),'-',
inet_ntoa(ip_addr+(POWER(2,32)-ip_mask-1))) range
from subnets
order by ip_addr
Run Code Online (Sandbox Code Playgroud)
最好这是一个可以在mysql,postgres,oracle等下工作的SQL语句.
我有一个IP范围表,我需要生成一个拒绝特定国家/地区的网络列表.
所以我可以用我的db生成一个ip范围列表.
SELECT
ip_from,
Inet_ntoa(ip_from),
ip_to,
Inet_ntoa(ip_to)
FROM
ip_address_data
WHERE
country_code = 'XX'
LIMIT 1
Run Code Online (Sandbox Code Playgroud)
这会产生这个结果
ip_from inet_ntoa(ip_from) ip_to inet_ntoa(ip_to)
16777472 1.0.1.0 16778239 1.0.3.255
Run Code Online (Sandbox Code Playgroud)
但是我需要CIDR格式的输出,有时范围会像这样返回多行.
1.0.1.0/24
1.0.2.0/23
Run Code Online (Sandbox Code Playgroud)
有没有办法使用select语句动态生成这些?这种语法很棒但是我假设它必须是一个存储过程,如果它将为每个输入行返回多个输出行.
SELECT
CONCAT('/sbin/route add -net ', CONVERT_TO_CIDR(ip_from,ip_to), ' reject;') AS command
FROM
ip_info.ip_address_data
WHERE
country_code='XX'
Run Code Online (Sandbox Code Playgroud)