如何发表案例陈述并忽略用户的输入postgres

时间:2018-09-18 13:32:10

标签: sql postgresql case

因此,我有一个WebApp,允许用户在查询中输入参数以使用例如国家/地区的表达式获取结果

: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之间,所以我可以通过这种方式解决此问题

问题

paramter(: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)

这where语句给我0个结果 我应该使用合并吗?

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

3 个答案:

答案 0 :(得分:1)

在什么情况下使用OR代替

 where   ctf.text = :Land or ctf.text like '%countryname%'

答案 1 :(得分:0)

我建议:

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

但是,您的逻辑也在检查长度。所以:

where ( (ctf.text = :Land and length(:Land) < 3) or :Land is null or length(:Land) >= 3)

答案 2 :(得分:0)

我的问题的答案是

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

我遗漏了一个通配符%%

如果您碰巧知道此声明的任何替代方法,请添加!