返回多行作为逗号分隔值与语句

时间:2016-07-31 10:02:17

标签: sql postgresql

尝试在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)(逗号分隔值)而不是多行的列?

2 个答案:

答案 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
      . . .