Фильтровать значения json независимо от ключей в PostgreSQL - PullRequest
0 голосов
/ 18 октября 2018

У меня есть таблица с именем diary, которая включает столбцы, перечисленные ниже:

| id | user_id | custom_foods       |
|----|---------|--------------------|
| 1  | 1       | {"56": 2, "42": 0} |
| 2  | 1       | {"19861": 1}       |
| 3  | 2       | {}                 |
| 4  | 3       | {"331": 0}         |

Я бы хотел посчитать, сколько дневников имеют значения (custom_foods) больше 0 у каждого пользователя.Меня не волнуют ключи, так как ключи могут быть любым числом в строке.

Желаемый вывод:

| user_id | count   |
|---------|---------|
| 1       | 2       |
| 2       | 0       |
| 3       | 0       |

Я начал с:

select *
from diary as d
join json_each_text(d.custom_foods) as e
on d.custom_foods != '{}'
where e.value > 0

Я даже не знаю, правильный ли синтаксис.Теперь я получаю сообщение об ошибке:

ОШИБКА: функция json_each_text (текст) не существует
ЛИНИЯ 3: объедините json_each_text (d.custom_foods) как e

СОВЕТ: ни одна функция не соответствует заданному имени и типу аргумента.Возможно, вам потребуется добавить явные приведения типов.

Моя используемая версия: psql (10.5 (Ubuntu 10.5-1.pgdg14.04 + 1), сервер 9.4.19).Согласно документации PostgreSQL 9.4.19 эта функция должна существовать.Я так растерялся, что не знаю, как действовать дальше.

Потоки, на которые я ссылался:

1 Ответ

0 голосов
/ 18 октября 2018

Ваш столбец custom_foods определен как текст, поэтому вы должны привести его к json перед применением json_each_text.Поскольку json_each_text по умолчанию не учитывает пустых jsons, вы можете получить значение 0 для пустых jsons из отдельного CTE и выполнить 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...