将两个查询合并为一个

问题描述:

在我的数据库中,我有survey_results表,其中有jsonbscores:列。此列具有以下格式:将两个查询合并为一个

{ 
    '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}'; 

我不知道是否有什么办法将这些查询连接到适用于两种情况的一个查询?

+1

你可以在两个查询之间使用'UNION'? – Berger

+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; 

哪里..​​....成为整或您正在寻找的路径。

基本上写你希望你的统一查询先看看,然后编写函数和操作符来让你到那里。