在我的数据库中,我有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}';
我想知道是否有办法将这些查询连接到一个适用于这两种情况的查询?
答案 0 :(得分:0)
我要做的是从两个重载函数开始
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;
其中...变为整数或您正在寻找的路径。
基本上写下您希望统一查询首先查看的方式,然后编写函数和运算符来实现目标。