带有case语句的-listagg的正确格式

时间:2019-01-17 09:01:30

标签: sql oracle oracle11g case listagg

我收到错误消息:ORA-00907: missing right parenthesis,但是我找不到错误的内容。

(select listagg(sp.name
||' : '||
(case when count(distinct sp.name) < 1 then NULL else szf.piece END) as cou_1, ',') 
WITHIN GROUP (ORDER BY sp.name,cou_1)
from sk_positions sp, sk_stock_f SZF, sk_stock SZ 
where SZF.CODE_ID =SK.ID AND SP.RID = SZF.RID_U AND SZF.ID_SZ = SZ.ID
and sp.sk_u = (%sk%) and SZF.piece != 0)

我认为,我在listagg - case中遇到问题。

2 个答案:

答案 0 :(得分:1)

错误在这里:

szf.piece END) as cou_1
               ^

您不能为子表达式加上别名,而只能为列的完整表达式命名。在Listagg中,它应该在within group ()完成之后出现。

类似的东西

WITHIN GROUP (ORDER BY sp.name,cou_1) as cou_1

答案 1 :(得分:0)

这在Oracle中是不允许的。您缺少通配符搜索条件的单引号。

sp.sk_u = (%sk%)

下面是正确的语法(只有LIKE符合这样的条件搜索,而不是=

sp.sk_u LIKE ('%sk%')

完整查询应如下所示

(select listagg(sp.name ||' : '||(case when count(distinct sp.name) < 1 
                                       then NULL 
                                       else szf.piece 
                                       END) as cou_1, ',') 
WITHIN GROUP (ORDER BY sp.name,cou_1)
from sk_positions sp, sk_stock_f SZF, sk_stock SZ 
where SZF.CODE_ID =SK.ID
      AND SP.RID = SZF.RID_U 
      AND SZF.ID_SZ = SZ.ID
      and sp.sk_u LIKE ('%sk%') 
      and SZF.piece != 0)