postgresql – 根据参数构建where子句

在PostgreSQL中,我试图在函数中构建一个where子句,该函数使用入站参数来确定IN的内容

例如:

select fld1, count(fld1)
from xyz
where fld1 in (
    case $1
        when 1 then 'Value1'
        when 2 then 'Value2'
        when 3 then '''Value1'',''Value2'''
        when 4 then '''Value4'',''Value5'',''Value6'''
    else NULL
)
group by fld1

值1和Value2一样正常,值3和4在语法上不会失败,但不返回任何行.

最佳答案
你的建议是不好的做法

从给出的代码看起来你想要的

>从您的应用程序中提供变量$1
>取决于提供的变量,确保将列fld1设置为一组特定的值.
>我喜欢the suggestion使用简单的OR,但是,如果你的条件很复杂并且你想保持它可能会变得非常混乱.这是另一种方式.

这是你的代码,

select fld1, count(fld1)
from xyz
where fld1 in (
    case $1
        when 1 then 'Value1'
        when 2 then 'Value2'
        when 3 then '''Value1'',''Value2'''
        when 4 then '''Value4'',''Value5'',''Value6'''
    else NULL
)
group by fld1

但是,我会将其作为JOIN展开,然后将其弹出到另一个表中.实际上CASE应该永远不会在WHERE子句中使用.

select fld1, count(fld1)
from xyz
join ( VALUES
  (1, ARRAY['Value1'])
  , (2, ARRAY['Value2'])
  , (3, ARRAY['Value1','Value2'])
  , (4, ARRAY['Value4','Value5','Value6'])
) AS cond(code,values)
  ON ( code = $1 AND fld1 = any(cond.values) )
group by fld1

从那里你甚至可以使用CTE,它可以使它更快,并且它看起来更易于维护.

WITH cond(code,values) AS (VALUES
  (1, ARRAY['Value1'])
  , (2, ARRAY['Value2'])
  , (3, ARRAY['Value1','Value2'])
  , (4, ARRAY['Value4','Value5','Value6'])
)
select fld1, count(fld1)
from xyz
join cond ON ( code = $1 AND fld1 = any(cond.values) )
group by fld1

从CTE中,如果它变得太血腥,你也可以将cond(fld1,values)作为自己的表.

转载注明原文:postgresql – 根据参数构建where子句 - 代码日志