过滤json值,而不考虑PostgreSQL中的键

时间:2018-10-18 04:39:04

标签: sql json postgresql

我有一个名为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)不存在
  第3行:以e

的身份加入json_each_text(d.custom_foods)      

提示:没有函数与给定的名称和参数类型匹配。您可能需要添加显式类型转换。

我使用的版本是:psql(10.5(Ubuntu 10.5-1.pgdg14.04 + 1),服务器9.4.19)。根据{{​​3}},该功能应该存在。我很困惑,我现在不知道该如何进行。

我提到的线程:

1 个答案:

答案 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;

Demo