【问题标题】:Set-returning functions are not allowed in UPDATE when using Postgres 10使用 Postgres 10 时,UPDATE 中不允许设置返回函数
【发布时间】:2018-03-20 15:08:43
【问题描述】:

我们有一个旧的 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 发行说明中没有注意到的向后不兼容?有解决办法吗?

【问题讨论】:

  • 你可以改用regexp_match()
  • 是的,行为发生了变化。请参阅发行说明中的​​“更改出现在查询的 SELECT 列表 (Andres Freund) 中的集合返回函数的实现”项:postgresql.org/docs/current/static/release-10.html(“迁移到版本 10 ")
  • 会使用substring (album FROM '^6,(?:(.+),)?tv\d+')
  • @LaurenzAlbe,我需要解决方案来保持与旧 Postgres 版本的兼容性,所以如果你写一个答案,我会接受它。

标签: postgresql postgresql-10


【解决方案1】:

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

UPDATE plays SET album = substring (album FROM '^6,(?:(.+),)?tv\d+');

【讨论】:

    【解决方案2】:

    我遇到了一个更普遍的问题,我需要来自正则表达式的第二个匹配项。

    解决方案是嵌套子选择

    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 片段。

    【讨论】:

    • 更多功能的答案!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-16
    • 1970-01-01
    • 2020-04-10
    • 2020-07-14
    • 1970-01-01
    相关资源
    最近更新 更多