инвертируя где предложение с функцией, это возможно? - PullRequest
0 голосов
/ 04 июля 2019

В настоящее время я делаю сложный запрос с параметрами, которые будут выполнять поиск в связанных таблицах, это работает отлично, но если мне нужно сказать что-то вроде «Я хочу найти людей, у которых нет определенного условия», Мне нужно написать одно и то же предложение where дважды: один раз с IN и один раз с NOT IN. Есть ли способ избежать этого сценария? Что-то вроде functionX (выберите id из tablex): boolean

В настоящее время я получил что-то вроде этого:

   select * from tpatient 
   where 
     (includeparameter1 and TPatient.Id in 
       (select patientid from tdoctorvisit where x ilike parameter1)
     ) 
   or (
        (includeparameter1 = false) and TPatient.Id not in (
       select patientid from tdoctorvisit where x ilike parameter1)
     )

Можно ли как-то улучшить этот запрос ниже?

    select * from tpatient where 
  functionX(includeparameter1, TPatient.id, 
    select patientid from tdoctorvisit where x ilike parameter1)

Это сделало бы мой запрос немного меньше, так как я получил дюжину предложений where.

Ответы [ 2 ]

3 голосов
/ 04 июля 2019

Я думаю, что вы можете написать:

WHERE includeparameter1 = TPatient.Id in (select patientid from tdoctorvisit where x ilike parameter1)

Потому что:

  • includeparameter1 = a
  • TPatient.Id in (...) = b

Итак, у вас есть условие:

WHERE (a = true AND b = true) OR (a = false AND b = false)

Это то же самое, что WHERE a = b

1 голос
/ 04 июля 2019

Я думаю, что относительно прямым методом является боковое соединение:

select p.*
from tpatient p cross join lateral
     (values (p.Id in (select dv.patientid from tdoctorvisit dv where dv.x ilike parameter1) )
     ) v(visitflag)
where (includeparameter1 and v.visitflag) or
      (not includeparameter1 and not v.visitflag);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...