Как сделать заявление о случае и игнорировать вводимые пользователем постгрес - PullRequest
0 голосов
/ 18 сентября 2018

Итак, у меня есть веб-приложение, которое позволяет пользователю вводить параметры в запросе для получения результатов, используя выражение, например, страна

:Country   -- varchar type
:Grade     -- int

У меня есть запрос, в котором я проверяю по оценке учащихся, если пользователирешает ввести параметр или нет.

Запрос 1

select count(distinct s.students),s.gradenumber
from student s
join blablabla
where (Case when length(:Grade)>0 
            then gradenumber = :Grade 
            else gradenumber between 1 and 12
       END)

Так как я знаю, что школьный класс имеет ограничение от 1 до 12, я могу решить эту проблему таким способом

Проблема

Проблема с параметром (: Country) состоит в том, что если оставить его пустым, запрос не будет работать.Поэтому я пишу оператор case, чтобы игнорировать ввод пользователя, если он пуст, и продолжать работу с запросом

В приведенном ниже предложении where я проверяю ввод данных пользователя страны

 SELECT l.longtext as language,count(distinct s.studentnr) as Studentcount

        FROM student s
            join pupil p on p.id = s.pupilid
            join pupillanguage pl on pl.personid = p.id
            join language l on l.id = pl.languageid
            join pupilnationality pn on pn.personid = p.id
            join country ctf on ctf.id = pn.countryid

         where (CASE when LENGTH(:Land)<3    <----- focus on the where statement
                     then ctf.text = :Land 
                     else ctf.text like '%'
                 END)

Это где утверждение дает мне 0 результатов. Должен ли я использовать coalesce?

where (CASE when LENGTH(:Land)<3   
                     then ctf.text = :Land 
                     else ctf.text like ....
                 END)

Ответы [ 3 ]

0 голосов
/ 18 сентября 2018

Я бы посоветовал:

where ctf.text = :Land or :Land is null

Однако ваша логика также проверяет длину.Итак:

where ( (ctf.text = :Land and length(:Land) < 3) or :Land is null or length(:Land) >= 3)
0 голосов
/ 18 сентября 2018

Ответ на мою проблему:

 (CASE WHEN LENGTH(:Land)>3 then ctf.text = :Land else ctf.text like '%%' end)

Я оставил один символ подстановки %%

Если вы знаете какие-либо альтернативы этому утверждению, пожалуйста, добавьте!

0 голосов
/ 18 сентября 2018

как насчет ИЛИ вместо того, где

 where   ctf.text = :Land or ctf.text like '%countryname%'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...