【发布时间】:2019-11-29 06:18:11
【问题描述】:
使用Postgresql 11.6。我在 tab_a.sysdescr 中有值,我想使用 regex_replace 进行转换,并将这些转换后的值更新为 tab_b.os_type。
这是表 tab_a,其中包含 sysdescr 中的源字符串:
hostname | sysdescr |
-------------+-----------------+
wifiap01 | foo HiveOS bar |
switch01 | foo JUNOS bar |
router01 | foo IOS XR bar |
这是我更新的目标表 tab_b,在列 os_type 中:
hostname | mgmt_ip | os_type
-------------+--------------+---------
wifiap01 | 10.20.30.40 |
switch01 | 20.30.40.50 |
router01 | 30.40.50.60 |
这是示例tab_b 的期望状态:
hostname | mgmt_ip | os_type
-------------+--------------+---------
wifiap01 | 10.20.30.40 | hiveos
switch01 | 20.30.40.50 | junos
router01 | 30.40.50.60 | iosxr
我有一个可以针对单个 os_type 工作的有效查询。在此示例中,HiveOS:
UPDATE tab_b
SET os_type = (
SELECT REGEXP_REPLACE(sysdescr, '.*HiveOS.*', 'hiveos')
FROM tab_a
WHERE tab_a.hostname = tab_b.hostname
)
WHERE EXISTS (
SELECT sysdescr
FROM tab_a
WHERE tab_a.hostname = tab_b.hostname
);
我不知道如何将多个regex_replace 函数“链接”到一个查询中,或者通过嵌套的子查询。在 SELECT REGEX_REPLACE 之后添加 'OR' 行不起作用,并且无法在网上找到类似的示例。
End-goal 是一个查询函数,它将按照指定替换字符串,更新 tab_b 中所有行上的替换字符串。我希望避免深入研究PL/Python,但如果这是解决这个问题的最佳方法,那没关系。理想情况下,我可以定义第三个表,其中包含模式和replacement_string arguments - 并且可以以某种方式对其进行迭代。
编辑:我想要完成的示例
这不是有效的代码,但希望能证明我想要完成的工作。可以执行一次的单个查询,并将表中的每个sysdescr 转换/转换为新表中os_type 的正确值。
UPDATE tab_b
SET os_type = (
SELECT REGEXP_REPLACE(sysdescr, '.*HiveOS.*', 'hiveos') OR
SELECT REGEXP_REPLACE(sysdescr, '.*JUNOS.*', 'junos') OR
SELECT REGEXP_REPLACE(sysdescr, '.*IOS XR.*', 'iosxr')
FROM tab_a
WHERE tab_a.hostname = tab_b.hostname
)
WHERE EXISTS (
SELECT sysdescr
FROM tab_a
WHERE tab_a.hostname = tab_b.hostname
);
【问题讨论】:
标签: postgresql subquery