【问题标题】:Filter rows after string operation on unnested array对未嵌套数组进行字符串操作后过滤行
【发布时间】:2018-01-15 14:07:49
【问题描述】:

为什么这种情况会失败? 解决我的问题的最佳方法是什么?

SELECT * FROM myTable foo
WHERE ARRAY_AGG(SUBSTRING(UNNEST(foo.array), 'abc(.*?)xyz')) 
    && ARRAY['ElementA','ElementZ']

我的表有一个数组列,其中包含未解析的字符串。我在这里所做的是逐个元素地解析这些元素,然后再次重新组合成一个数组,这样我就可以比较处理后的数组是否包含我预期的任何元素

但它会返回:

错误:列“foo.id”必须出现在 GROUP BY 子句中或被使用 在聚合函数中

我真的需要按所有列分组吗? where 过滤器不应该是虚拟唯一的吗?有没有办法在不影响其余查询的情况下虚拟处理 unnest/nest 操作?

【问题讨论】:

  • 样本数据和预期结果将帮助其他人了解您尝试做什么。
  • 问题是所有这一切都是一种简化,我不确定过分关注模拟场景是否有价值,这样会更简单
  • @Whimusical 准备样本数据和所需的输出总是很有价值,有助于提供准确的解决方案。

标签: sql postgresql aggregate-functions


【解决方案1】:

我真的需要按所有列分组吗? where 过滤器不应该是虚拟唯一的吗?有没有办法在不影响其余查询的情况下虚拟处理 unnest/nest 操作

你可以使用JOIN LATERAL:

SELECT foo.*
FROM myTable foo
JOIN LATERAL (SELECT ARRAY_AGG(SUBSTRING(s.t, 'abc(.*?)xyz')) AS r
              FROM UNNEST(foo."array") s(t)
             ) sub 
   ON sub.r && ARRAY['ElementA','ElementZ'];

DBFiddle Demo


另一种“丑陋”的方式是使用子查询:

SELECT * 
FROM (
  SELECT *, (SELECT ARRAY_AGG(SUBSTRING(s.t, 'abc(.*?)xyz')) AS r
              FROM UNNEST(foo."array") s(t)
             ) r
  FROM myTable foo
) x
WHERE r && ARRAY['ElementA','ElementZ'];

DBFiddle Demo2

更多信息PostgreSQL: using a calculated column in the same query

【讨论】:

    猜你喜欢
    • 2021-10-23
    • 1970-01-01
    • 1970-01-01
    • 2015-06-29
    • 1970-01-01
    • 2015-10-02
    • 2023-04-02
    • 2022-12-22
    • 2022-11-24
    相关资源
    最近更新 更多