我有一个PostgreSQL
的数据库,有一个食物表格和一个标签表格.我需要使用psycopg3
根据标签(S)从Python
图形用户界面查询数据.如果标记参数是一个空列表,我需要使用来自食物表中所有餐厅的数据.
如果具有参数id(S)('ids_arg'
)的某些餐馆(S)具有一些参数标记(S)('tags_arg'
),则下面的查询返回所需的结果.如果'tags_arg'
列表是空的,在PostgreSQL中产生t.name = ANY (array[]::text[])
,我如何查询和计算所有没有ID或标签的餐厅的数据?我可以通过添加具有相同查询的UNION ALL
而不添加INNER JOIN
,并根据结果使用结果表的第一行或第二行来获得所需的结果,但这大约会使查询字符串文件中的行数增加一倍.考虑到可读性,这一点很重要.有没有一种巧妙的方法可以在不添加UNION ALL
行或以其他方式增加大量行的情况下获得相同的结果?效率分析也将不胜感激.
SELECT Total, Total - Drinks AS "Without drinks", Drinks
FROM (
SELECT
SUM (f.prepared)
FILTER (
WHERE f.date BETWEEN 'first' AND 'last'
AND f.restaurant_id = ANY ('ids_arg')
) AS Total,
SUM (f.prepared)
FILTER (
WHERE (f.product_id = 10 OR f.product_id = 17)
AND f.date BETWEEN 'first' AND 'last'
AND f.restaurant_id = ANY ('ids_arg')
) AS Drinks
FROM food f
INNER JOIN tags t
ON t.restaurant_id = f.restaurant_id
WHERE t.name = ANY ('tags_arg'::text[])
);
编辑:以下是包含UNION ALL
个问题和Zegarek的回答问题的dbfiddle分.