使用 Postgres 10 时更新中不允许设置返回函数
Set-returning functions are not allowed in UPDATE when using Postgres 10
我们有一个旧的 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 发行说明中是否存在我没有注意到的向后不兼容问题?有解决方法吗?
这未经测试,但应该适用于所有 PostgreSQL 版本:
UPDATE plays SET album = substring (album FROM '^6,(?:(.+),)?tv\d+');
我遇到了一个更普遍的问题,我需要来自正则表达式的第二个匹配项。
解决方案是嵌套子选择
SET my_column = (SELECT a.matches[2] from
(SELECT regexp_matches(my_column, '^(junk)?(what_i_want)$') matches) a)
或将正则表达式修改为 return 一组并应用@LaurenzAlbe 的答案:
SET my_column = substring (my_column FROM '^junk?(what_i_want)$')
可能存在修改正则表达式不理想的情况。
原来的形式是
SET my_column = regexp_matches(my_column, '^(junk)?(what_i_want)$')[2]
其中 junk
和 what_i_want
是相当复杂的 rexex 片段。
我们有一个旧的 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 发行说明中是否存在我没有注意到的向后不兼容问题?有解决方法吗?
这未经测试,但应该适用于所有 PostgreSQL 版本:
UPDATE plays SET album = substring (album FROM '^6,(?:(.+),)?tv\d+');
我遇到了一个更普遍的问题,我需要来自正则表达式的第二个匹配项。
解决方案是嵌套子选择
SET my_column = (SELECT a.matches[2] from
(SELECT regexp_matches(my_column, '^(junk)?(what_i_want)$') matches) a)
或将正则表达式修改为 return 一组并应用@LaurenzAlbe 的答案:
SET my_column = substring (my_column FROM '^junk?(what_i_want)$')
可能存在修改正则表达式不理想的情况。
原来的形式是
SET my_column = regexp_matches(my_column, '^(junk)?(what_i_want)$')[2]
其中 junk
和 what_i_want
是相当复杂的 rexex 片段。