错误:数组不能包含空的PostgreSQL
我的问题是错误:数组不能包含空的PostgreSQL,postgresql,Postgresql,我的问题是 SELECT id, ARRAY_AGG(session_os)::integer[] FROM t GROUP BY id HAVING ARRAY_AGG(session_os)::integer[] && ARRAY[1,NULL] 它给出了错误:数组不能包含空值 实际上,我想得到像这样的行 id | Session_OS -------|------------- 641 | {1, 2} 642 | {NULL,
SELECT
id,
ARRAY_AGG(session_os)::integer[]
FROM
t
GROUP BY id
HAVING ARRAY_AGG(session_os)::integer[] && ARRAY[1,NULL]
它给出了错误:数组不能包含空值
实际上,我想得到像这样的行
id | Session_OS
-------|-------------
641 | {1, 2}
642 | {NULL, 2}
643 | {NULL}
请检查这里的样本数据
运算符不支持NULL
值。所以,你需要另一种方法。例如,可以先将数据连接到表中。这将为您提供链接到所需数据的id
s。在第二步中,您可以使用这些id
s延迟所有值
创建包含相关数据的表或查询结果,包括NULL
值
您可以使用运算符加入数据,包括NULL
值,该运算符与考虑NULL
的
没有区别
现在您已经获取了相关的id
值,这些值可以在WHERE
过滤器中使用
最后,您可以进行聚合
扩展为int[]安装自己的&&
运算符,这不允许空值,并且优先于内置的&
运算符
如果您没有使用intarray,您可以卸载它(除了在dbfiddle中,您不能卸载)。如果您偶尔使用它,我认为最好将其安装在自己的模式中,而该模式不在您的搜索路径中。然后,您需要在确实需要它的运算符时对其进行模式限定
或者,您也可以将intarray保留在适当的位置,并在需要常规内置运算符时对其进行模式限定,如图所示。谢谢。当我在数组中只传递null时,你们能检查一下吗?它抛出了一个错误。如果数组仅包含空值,则不清楚该数组是哪种类型。所以你必须手动施放它。在这种情况下,您有int值,这需要int arrayThank。一切正常。我只有在安装了intarray扩展时才会出现这个错误(dbfiddle显然是默认安装的,这对我来说有点奇怪)
SELECT
id,
ARRAY_AGG(session_os) -- 4
FROM t
WHERE id IN ( -- 3
SELECT
id
FROM
t
JOIN (
SELECT unnest(ARRAY[1, null]) as a -- 1
)s ON s.a IS NOT DISTINCT FROM t.session_os -- 2
)
GROUP BY id