1

我知道这个问题以前曾针对不同的语言提出过,但据我所知,它依赖于流控制(“for 循环”)和/或深奥的 Perl 函数。

所以在 PostgreSQL 中,我正在尝试编写一个数据库迁移来将我们存储的网络信息转换text为适当的inet类型。假设我的“Foo”表有两列,“地址”存储 IP 地址本身,“网络掩码”存储“网络掩码”(例如'255.255.255.0')。我想将这些作为单一inet类型的列插入到新“Bar”表的单个“ip”字段中。

到目前为止,我所得到的转换 IP 非常简单,但我在掩码长度上苦苦挣扎。我认为它看起来像:

INSERT INTO bar(ip)
    SELECT set_masklen(address::inet, calculate_masklen_from_netmask(netmask))
    FROM foo
;

...但我不知道如何定义该函数,calculate_masklen_from_netmask因为我不能在基于语句的语言中使用流控制结构。

4

1 回答 1

0

您可以(ab)inet_merge用于该目的。使用masklen(inet_merge(netmask, inet '255.255.255.255').

在您的情况下,您可能会更干净地获取完整地址inet_merge(address & netmask, address | ~netmask)(但避免netmask用作名称,因为它已经是一个函数)。您可以省略& netmask,我将其包括在内以保持完整性/清晰性。你可以做inet_merge(address, address | ~netmask)

于 2021-09-24T15:55:56.837 回答