我有一个名为Deliverable to Epic
的表,其中包含以下列出的列:
diary
我想计算每个用户有| id | user_id | custom_foods |
|----|---------|--------------------|
| 1 | 1 | {"56": 2, "42": 0} |
| 2 | 1 | {"19861": 1} |
| 3 | 2 | {} |
| 4 | 3 | {"331": 0} |
个值大于0的日记。我不在乎键,因为键可以是字符串中的任何数字。
所需的输出是:
custom_foods
我从开始:
| user_id | count |
|---------|---------|
| 1 | 2 |
| 2 | 0 |
| 3 | 0 |
我什至不知道语法是否正确。现在我得到了错误:
错误:函数json_each_text(text)不存在
的身份加入json_each_text(d.custom_foods)
第3行:以e
提示:没有函数与给定的名称和参数类型匹配。您可能需要添加显式类型转换。
我使用的版本是:psql(10.5(Ubuntu 10.5-1.pgdg14.04 + 1),服务器9.4.19)。根据{{3}},该功能应该存在。我很困惑,我现在不知道该如何进行。
我提到的线程:
答案 0 :(得分:0)
您的custom_foods
列已定义为文本,因此在应用json_each_text
之前应将其强制转换为json。由于默认情况下,json_each_text
不考虑空json,因此对于来自单独CTE的空json,您可以将计数设为0,然后执行UNION ALL
WITH empty AS
( SELECT DISTINCT user_id,
0 AS COUNT
FROM diary
WHERE custom_foods = '{}' )
SELECT user_id,
count(CASE
WHEN VALUE::int > 0 THEN 1
END)
FROM diary d,
json_each_text(d.custom_foods::JSON)
GROUP BY user_id
UNION ALL
SELECT *
FROM empty
ORDER BY user_id;