【问题标题】:Get all array_agg() values with one matched value Postgres获取具有一个匹配值 Postgres 的所有 array_agg() 值
【发布时间】:2020-12-14 13:24:30
【问题描述】:

我想用一个匹配值获取所有 array_agg() 值。

就像robotsession."Session_OS" 中有多个值 ['Android', 'IOS', 'Windows']

在我当前的查询中,它只给出 ['Android']。但我想要所有。

我的查询是:

SELECT robotAds."Ad_ID",
    ARRAY_AGG(DISTINCT quote_literal(robotSession."Session_OS"))
    as Session_OS
    FROM robot__ads robotAds LEFT JOIN
    robot__session__scraper__data robotScraper ON
    robotScraper."adIDAdID" = robotAds."Ad_ID" LEFT JOIN
    robot__session_data robotSession ON robotSession."id" = robotScraper."sessionIDId" WHERE
    robotScraper."sessionIDId" IS NOT NULL
    AND robotsession."Session_OS" IN ('Android')
    GROUP BY robotAds."Ad_ID"

在这个查询的结果中,“Session_OS”只给出了“Android”的值。

这个查询的样本数据是这样的:

  id   | Session_OS
-------|-------------
 641   | {'Android'}
 642   | {'Android'}
 643   | {'Android'}

但我想要所有 IN Session_Os Agregation 的值,如果它匹配任何一个。就像在我的查询中一样,它与“Android”匹配:

  id   | Session_OS
-------|-------------
 641   | {'Android, 'IOS'}
 642   | {'Android, 'Windows'}
 643   | {'Android', 'IOS', 'Windows'}

我怎样才能做到这一点??

更新:

完整数据,查询中没有此条件AND robotsession."Session_OS" IN ('Android')

  id   | Session_OS
-------|-------------
 641   | {'Android, 'IOS'}
 642   | {'Android, 'Windows'}
 643   | {'Android', 'IOS', 'Windows'}
 644   | {'IOS', 'Windows'}
 645   | {'IOS'}

但是在查询结果中添加条件AND robotsession."Session_OS" IN ('Android')之后是

   id  | Session_OS
-------|-------------
 641   | {'Android'}
 642   | {'Android'}
 643   | {'Android'}

但我想要这个。我该怎么做?

  id   | Session_OS
-------|-------------
 641   | {'Android, 'IOS'}
 642   | {'Android, 'Windows'}
 643   | {'Android', 'IOS', 'Windows'}

【问题讨论】:

  • a) 请将您的示例代码最小化为与描述您的问题相关的绝对必要部分。 IE。我想,没有必要向我们展示 3 或 4 个连接。 b) 请添加一些示例数据和预期的输出,以便我们重现您的问题
  • 您好,感谢您的快速回复。我已经更新了我的问题。请再次检查。
  • quote_literal() 是什么。分组前请先显示数据
  • quote_literal() 什么都不是。你可以忽略它。它只是为每个值添加引号('')。
  • 请检查更新的问题。

标签: postgresql


【解决方案1】:

demo:db<>fiddle

SELECT
    id,
    ARRAY_AGG(session_os)
FROM
    t
GROUP BY id
HAVING ARRAY_AGG(session_os) && ARRAY['Android']

您的问题是您首先使用session_os = Android 过滤记录。然后你将这些聚合起来。

如果 Android 是一个元素,您必须先聚合,然后查看数组聚合。这可以使用HAVING 子句和&amp;&amp; 运算符来完成,如果两个数组包含相同的元素,则返回true。

【讨论】:

  • 嗨,谢谢,这是有效的。还有一个问题。如果 ARRAY_AGG(session_os) 中有空值怎么办?它抛出一个错误。错误:数组不能包含空值 SQL 状态:22004
  • 嗨,谢谢,这是有效的。还有一个问题。如果 ARRAY_AGG(session_os) 中有空值怎么办?它抛出一个错误。错误:数组不能包含空值 SQL 状态:22004
  • 您可以在分组前轻松添加“WHERE session_os IS NOT NULL”过滤器:dbfiddle.uk/…
  • 为什么它也不允许我获取 NULL 值?如果我使用“WHERE session_os IS NULL”并且 HAVING ARRAY_AGG(session_os) && ARRAY['Android']。它再次抛出相同的错误。我不能这样做。我无法获得 NULL 值?
  • dbfiddle.uk/…。我的情况是这样的......在这种情况下,我也可以获得空值。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-11-15
  • 1970-01-01
  • 1970-01-01
  • 2016-08-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多