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;
是一把小提琴。谢谢你的帮助,这就是我要找的。看起来不漂亮,但它做了它应该做的!