Как проверить вхождение значения из подзапроса в запросе SQL - PullRequest
0 голосов
/ 13 ноября 2018

У меня есть запрос PostgreSQL, у которого есть подзапрос. Подзапрос и возвращенные данные выглядят так:

SELECT i.item_id,
       i.updated_date,
       i.quantity
FROM   items i
WHERE  item IN (1675, 1676);

   item    |   updated_date   |   quantity
===========================================
  1675     |     2018-05-01   |      100
  1676     |     2018-05-01   |       0

Мне нужно, чтобы основной запрос возвратил 1, если COUNT столбца updated_date не равен 0, а любое из значений quantity равно 0. У меня проблемы с продумыванием этого:

SELECT   CASE WHEN COUNT(item_subquery.update_date) !=0
              AND /* Can't figure out what to put here*/
              THEN 1
              ELSE 0
         END as check_data

FROM     (SELECT i.item_id,
                 i.updated_date,
                 i.quantity
          FROM   items i
          WHERE  item IN (1675, 1676)) item_subquery

Я пытался заменить мой комментарий в выражении CASE на item_subquery.quantity = 0, но это не работает, и я частично понимаю, почему. Мне трудно понять, как это сделать.

Как мне проверить, есть ли какое-либо значение в столбце quantity моего подзапроса и включить его в мое утверждение case?

ОТВЕТ

Мне удалось выяснить это, на всякий случай, если кто-то ищет ответ. Вы можете добавить функцию FILTER к вашей функции подсчета, чтобы сузить то, что именно подсчитывается. Вот как будет выглядеть запрос с тем, что я искал изначально:

SELECT   CASE WHEN COUNT(item_subquery.update_date) !=0
              AND COUNT(item_subquery.quantity) FILTER(item_subquery.quantity = 0) > 0
              THEN 1
              ELSE 0
         END as check_data

FROM     (SELECT i.item_id,
                 i.updated_date,
                 i.quantity
          FROM   items i
          WHERE  item IN (1675, 1676)) item_subquery

1 Ответ

0 голосов
/ 13 ноября 2018

В Postgres легко преобразовать логические значения в числа. Итак, вы можете написать логику как:

SELECT (SUM( (quantity = 0)::int) > 0 AND COUNT(updated_date) > 0)::int
FROM items i
WHERE item IN (1675, 1676);

Это, в свою очередь, можно упростить до:

SELECT ( SUM( (quantity = 0)::int ) > 0)::int
FROM items i
WHERE item IN (1675, 1676);

Вы можете использовать подзапрос, если хотите, но это не обязательно.

...