Возможно ли упростить данный запрос?

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

select *
from people p
         left join animal a on a.id_people = p.id
where exists(select *
             from people p
                 join animal a on a.id_people = p.id
             where a.code = '3-1')
    and a.code = '3-1'
    or not exists(select *
                  from people p
                      join animal a on a.id_people = p.id
                  where a.code = '3-1')

Спасибо Гончарову Александру, в итоге получилось

select *
from people p
         left join animal a on a.id_people = p.id
where CASE
          WHEN exists(select *
                      from people p
                          join animal a on a.id_people = p.id
                      where a.code = '3-1') THEN a.code = '3-1'
          ELSE TRUE
      END;

Я затупил, понял что можно и так сделать

select *
from people p
         left join animal a on a.id_people = p.id
where a.code = '3-1'
    or not exists(select *
                  from people p
                      join animal a on a.id_people = p.id
                  where a.code = '3-1')

Ответы (1 шт):

Автор решения: Гончаров Александр

То есть false в условие where может получиться только в случае если exists(select * from people p join animal a on a.id_people = p.id where a.code = '3-1') = true , а (a.code = '3-1') = false . То есть если во всей таблице(склеенной из двух) существует запись '3-1', но данная запись не '3-1', только тогда условие where = false. То есть смысл запроса выходит: Если существуют записи таблицы с '3-1' , то вывести только их, иначе вывести всё.

Воплощаем смысл запроса кодом:

select * from people p left join animal a on a.id_people = p.id
where IF( 
     exists(select * from people p join animal a on a.id_people = p.id where a.code = '3-1') 
     , a.code = '3-1'
     , 1
 );

Учебный чисто пример для взрыва мозга, вроде. На то, что надо сначала смысл запроса понять, а потом перевести смысл обратно в sql. В реальности такие два разные запроса по сути в один паковать не будут даже яростные извращенцы, думаю.

→ Ссылка