8

我们有旧的 Flyway 数据库更新

UPDATE plays SET album = (regexp_matches(album, '^6,(?:(.+),)?tv\d+'))[1]

...在 9.2 到 9.6 的任何 Postgres 版本上运行良好,但在最新的 Postgres 10 上运行失败。即使在没有任何 JDBC 的情况下直接运行也会发生。

ERROR: set-returning functions are not allowed in UPDATE

是否存在我从版本 10 发行说明中没有注意到的向后不兼容?有解决方法吗?

4

2 回答 2

7

这是未经测试的,但应该适用于所有 PostgreSQL 版本:

UPDATE plays SET album = substring (album FROM '^6,(?:(.+),)?tv\d+');
于 2017-10-11T12:45:44.207 回答
7

我有一个更普遍的问题,我需要来自正则表达式的第二场比赛。

解决方案是嵌套子选择

SET my_column = (SELECT a.matches[2] from 
    (SELECT regexp_matches(my_column, '^(junk)?(what_i_want)$') matches) a)

或修改正则表达式以返回一组并应用@LaurenzAlbe 的答案:

SET my_column = substring (my_column FROM '^junk?(what_i_want)$')

在某些情况下,修改正则表达式并不理想。

原件的形式是

SET my_column = regexp_matches(my_column, '^(junk)?(what_i_want)$')[2]

哪里junkwhat_i_want是相当复杂的 rexex 片段。

于 2018-06-27T23:16:12.423 回答