Проверьте значение count в предложении where - PostgreSQL - PullRequest
0 голосов
/ 25 февраля 2020

Предположим, у меня есть следующая структура таблицы:

create table sometable (id serial, name varchar(20), Delete_Flag smallint);

Со следующими записями:

 id | name | delete_flag
----+------+-------------
  1 | AA   |           1
  2 | BB   |           1

Можно ли написать запрос, чтобы проверить, является ли количество всех записей в sometable равен 2 и эти две записи имеют имя = ' AA ' и ' BB '? Не хочу писать функцию, а просто простой запрос.

Как и return TRUE , если count (*) sometable = 2 и имя в ('AA', 'BB')

еще возврат ЛОЖЬ

Спасибо

Ответы [ 3 ]

0 голосов
/ 25 февраля 2020

это то что тебе нужно?

select count(*) from sometable having
count(*)  = ( select count(*) from sometable where name in ('AA','BB');
0 голосов
/ 25 февраля 2020

Если я правильно прочитал, вы ищете ровно 1 AA и 1 BB. Итак,

with sometable (name) as
    (values  ('AA'),('BB'))
 select aa_cnt = 1 AND bb_cnt=1
   from (select count(*) FILTER (WHERE name = 'AA') aa_cnt
              , count(*) FILTER (WHERE name = 'BB') bb_cnt
           from sometable
        ) c ;

Но если имя не уникально или 1 отсутствует

with sometable (name) as
    (values ('AA'),('BB'), ('AA') )
 select aa_cnt = 1 AND bb_cnt=1
   from (select count(*) FILTER (WHERE name = 'AA') aa_cnt
              , count(*) FILTER (WHERE name = 'BB') bb_cnt
           from sometable
        ) c;

  with sometable (name) as
    (values ('AA'), ('AA') )
 select aa_cnt = 1 AND bb_cnt=1
   from (select count(*) FILTER (WHERE name = 'AA') aa_cnt
              , count(*) FILTER (WHERE name = 'BB') bb_cnt
           from sometable
        ) c  

Я думаю, что ответ @Deepika вернет правильный, но неверный результат для последнего набора данных. Но я могу быть совершенно неправильно истолковывать это требование.

0 голосов
/ 25 февраля 2020

Вы можете написать:

select (array_agg(name order by name) = array['AA', 'BB']) as flag
from sometable t
...