将两个查询合并为一个
问题描述:
在我的数据库中,我有survey_results
表,其中有jsonb
scores
:列。此列具有以下格式:将两个查询合并为一个
{
'total' => 1,
'categories' => {
'food' => 'medium'
}
}
我有两个SQL查询第一种:
SELECT ('{low,medium,high}'::varchar[])[(scores->>'total')::int] score, count(*) total
FROM "survey_results"
GROUP BY scores->>'total';
和第二个:
SELECT scores #>> '{categories, food}' score, count(*) total
FROM survey_results
GROUP BY scores #>> '{categories, food}';
我不知道是否有什么办法将这些查询连接到适用于两种情况的一个查询?
答
我会做的是有两个重载函数
create function score(int, jsonb) returns varchar
language sql immutable as
$$ select ('{low,medium,high}'::varchar[])[$1]; $$;
而且
create function score(path text, jsonb) returns varchar
language sql immutable as
$$ select $2 #>> $1 $$;
开始然后,你可以这样做:
SELECT score(..., scores), count(*) from survey_results
group by 1;
哪里......成为整或您正在寻找的路径。
基本上写你希望你的统一查询先看看,然后编写函数和操作符来让你到那里。
你可以在两个查询之间使用'UNION'? – Berger
我不想合并这两个查询的结果。我想有一个适用于每种场景的查询。当键值为字符串且键值为整数时。 –