Если все результаты равны, верните true

#mysql #sql #aggregate-functions

#mysql #sql #агрегатные функции

Вопрос:

У меня есть простой select, который возвращает один столбец:

результат: {1,1,2}

Я хочу проверить, все ли результаты равны 1, затем верните true, и если в одном столбце есть 2, верните false.

Пробовал что-то вроде этого:

 SELECT IF(items.status=1, 'true', 'false') AS result
FROM bd.items 
WHERE items.id=33
  

Но, очевидно, он возвращает true, если значение равно 1, и false, если оно равно 2, а не только один результат.

Например:

{1,1,1}=true

{1,2,1}=false

{1}=true

{2}=false

Комментарии:

1. если все результаты равны 1, верните true, а если в одном столбце есть 2, верните false. Подумайте в обратном направлении — если хотя бы одна строка имеет значение 2, тогда false, иначе true . Если 1 и 2 являются единственно возможными значениями, тогда достаточно проверить MAX(значение).

Ответ №1:

Это то, что вы хотите?

 select min(status = 1) as result
from bd.items
where id = 33
  

Это возвращает 1 тогда и только тогда, когда все строки имеют status 1 . Если в столбце есть какое-либо другое (не- null ) значение, то возвращается это 0 .

Если вы хотите это для всех элементов сразу:

 select id, min(status = 1) as result
from bd.items
group by id
  

Комментарии:

1. Другие ответы также работают, но пока я буду использовать это, спасибо.

Ответ №2:

Попробуйте следующий запрос:

 select 
case 
when (max(items.status)=min(items.status) and min(items.status)=1) 
then 'True' else 'False' end
from items
where items.id=33
group by id
  

Ответ №3:

Вы можете использовать следующий подход:

 select 
    id, count(status) = count(case when status=1 then 1 end) status
from items
group by id
;
  

Запрос возвращает true, когда количество всех строк равно количеству строк со статусом = 1

Этот и пара других запросов здесь