尝试在Postgresql中创建一个带有4个参数的函数,该参数返回一个表(多行)。
参数:in_customer_id, in_start_date, in_end_date, in_risk_flag
我在该函数中使用的sql查询是:
select * from customer as k
where k.customer_id IN (case when $1 = 0 then (select distinct(customer_id) from customer)
when $1 != 0 then $1
end)
and k.start_date >= $2
and k.end_date <= $3
and k.risk_flag IN (case when $4 = 0 then (select distinct(risk_flag) from customer)
when $4 != 0 then $4
end)
我得到的错误是错误[21000]:more than one row returned by subquery used as an expression
。
有没有办法从case语句返回(1,2,3,4,5,6)(逗号分隔值)而不是多行的列?
答案 0 :(得分:1)
首先:distinct
不 一个函数。写distinct (customer_id)
毫无意义。在用于IN
条件的子选择中,distinct
无论如何都是无用的。
您似乎想要在传递参数时选择特定客户,否则您想要选择所有客户。据我所知,你不需要进行子选择。这样的事情应该这样做:
where k.customer_id = case
when $1 <> 0 then $1
else k.customer_id
end
当第一个参数作为where customer_id = customer_id
传递时,它基本上将条件转换为0
(尽管你应该更好地使用空值,而不是像“零”那样的“魔术”值) p>
这假设customer_id
被定义为NOT NULL
,否则这将无效。
您可以对risk_id
应用相同的模式(同样:只有在risk_id
不能包含NULL
值的情况下才会有效。)
答案 1 :(得分:0)
通常会简化此逻辑以避免case
子句中的where
:
where ($1 = 0 or $1 = k.customer_id) and
. . .