基于参数构建 where 子句

use*_*735 3 postgresql case 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
Run Code Online (Sandbox Code Playgroud)

值 1 和值 2 一样正常工作,值 3 和 4 在语法上没有失败,但没有返回任何行。

ype*_*eᵀᴹ 5

CASE表达式的输出必须是单个值而不是值列表。

该语句没有给出案例 3 和 4 的语法错误,因为它 '''Value1'',''Value2'''被评估为单个字符串(包括 4 个引号字符和一个逗号):'Value1','Value2'

您可以使用CASE计算结果为布尔值的表达式重写您的条件,如下所示:

select fld1, count(*)
from xyz
where case $1
          when 1 then fld1 in ('Value1')
          when 2 then fld1 in ('Value2')
          when 3 then fld1 in ('Value1', 'Value2')
          when 4 then fld1 in ('Value4', 'Value5', 'Value6')
      end
group by fld1 ;
Run Code Online (Sandbox Code Playgroud)

但我更愿意使用更简单的方式编写它OR

select fld1, count(*)
from xyz
where ( $1 = 1 and fld1 in ('Value1')
     or $1 = 2 and fld1 in ('Value2')
     or $1 = 3 and fld1 in ('Value1', 'Value2')
     or $1 = 4 and fld1 in ('Value4', 'Value5', 'Value6')
      )
group by fld1 ;
Run Code Online (Sandbox Code Playgroud)