错误:数组不能包含空的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