Sql 如何聚合查询中的第一个非空值

Sql 如何聚合查询中的第一个非空值,sql,postgresql,Sql,Postgresql,我有一个复杂的权限层次结构,但会尽量简化这个问题。给定一个表permission,其中包含列permissionIDread和write(作为可为空的整数),我正在寻找一种确定有效权限的方法,例如,给定多个权限条目,我想检索第一个条目(非常重要,因为我正在按permissionID对它们进行排序)read和write不为空的条目。理想情况下,这将使用聚合函数完成,但没有一个函数可以满足我的要求 例如: permissionID | read | write -------------------

我有一个复杂的权限层次结构,但会尽量简化这个问题。给定一个表
permission
,其中包含列
permissionID
read
write
(作为可为空的整数),我正在寻找一种确定有效权限的方法,例如,给定多个
权限
条目,我想检索第一个条目(非常重要,因为我正在按
permissionID
对它们进行排序)
read
write
不为空的条目。理想情况下,这将使用聚合函数完成,但没有一个函数可以满足我的要求

例如:

permissionID | read | write
----------------------------
1            | NULL | NULL
2            | NULL | False
3            | False| True
4            | True | True

SELECT first_not_null(read), first_not_null(write) FROM permission ORDER BY permissionID;

| read  | write |
-----------------
| False | False |
在这种情况下,
first\u not\u null
将是一个虚构的聚合函数,它将产生我想要的结果。我试图用它来实现的是避免多个查询,以创建这个“有效权限”结果(真正的东西比
read
write
有更多的列)


我非常感谢任何形式的帮助或正确方向的点评。

唉,Postgres不支持
忽略null
s。一种方法是对数组聚合的一种攻击——将值聚合到一个数组中,删除
NULL
值并获取第一个值:

select (array_remove(array_agg(read order by permissionId), NULL))[1],
       (array_remove(array_agg(write order by permissionId), NULL))[1]
from t;

是一把小提琴。

谢谢你的帮助,这就是我要找的。看起来不漂亮,但它做了它应该做的!