如何解决postgres不同类型的数据在不同列上有自己的限制
我有一个要从中获取数据的CTE,但是我希望根据不同的规则从同一个CTE中获取具有相同限制的不同类型的数据。
示例:fruit_cte->(id :: integer,name :: text,q1 :: boolean,q2 :: boolean)
我可以做类似的事情:
SELECT * FROM (SELECT 1 as query_num,* FROM fruit_cte WHERE q1 ORDER BY name LIMIT 100) as ABC
UNION ALL
SELECT * FROM (SELECT 2 as query_num,* FROM fruit_cte WHERE q2 ORDER BY name LIMIT 100) as ABC
UNION ALL
SELECT * FROM (SELECT -1 as query_num,* FROM fruit_cte WHERE NOT q1 AND NOT q2 ORDER BY name LIMIT 100) as ABC
但这是非常昂贵的,最好将其绑定为1个选择。这有可能吗?
最后一个选择是必须获取不符合要求但可能没有的数据。
PG版本11 +
解决方法
您可以使用window functions而不用CTE来获得全部内容。
SELECT type,id,name,q1,q2
FROM (
SELECT
CASE WHEN q1 THEN 1 WHEN q2 THEN 2 ELSE -1 END AS type,ROW_NUMBER() OVER (
PARTITION BY CASE WHEN q1 THEN 1 WHEN q2 THEN 2 ELSE -1 END
ORDER BY NAME
) AS row_number,q2
FROM ...
)
WHERE row_number <= 100
row_number()
将计数,按name
排序,并为每个type
保留一个单独的计数
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。