【问题标题】:Using nvl in a listagg SQL Oracle在 listagg SQL Oracle 中使用 nvl
【发布时间】:2016-10-16 02:14:37
【问题描述】:

在 listagg 中使用 nvl 调用时遇到问题。

我是 SQL 新手,所以我仍然对语法有疑问..

listagg(nvl(asgu.name, ', '),'In waiting')
   within group (order by asgu.name) as asgu_name,   
   case
   when asgu.name is not null then asgu.name
   else 'In Waiting'
   end 'In waiting',

错误:ORA-00923:FROM 关键字未在预期位置找到

【问题讨论】:

  • 添加完整查询以及示例数据和预期结果..
  • 这是一个很长的查询,我认为您不想看到全部内容。预期结果是名称,如果字段为空,那么我希望它说“等待中”。但是我可以告诉你,在添加 nvl 之前,这个查询工作得很好
  • 考虑使用coalesce - 比nvl 性能更好
  • @EdHeal 我也试过了,在组内(按 asgu.name 排序)作为 asgu_name,'等待中')并得到错误:缺少内
  • 请问,你的目标是什么?看起来你的文字也颠倒了。如果您希望分隔符为 ', ' 而缺失值为 'In waiting',则需要反转它们。但是,该 SQL 应该按原样运行,所以我认为问题出在其他地方。

标签: sql oracle listagg nvl


【解决方案1】:

您的listagg() 代码应该如下所示:

listagg(coalesce(asgu.name, 'In waiting'), ', ') within group (order by asgu.name) as asgu_names,  

其他代码没有意义。 asgu.name 正在聚合或未聚合。您应该有第二个表达式的聚合函数。

【讨论】:

    【解决方案2】:

    end 'In waiting' 行不正确。您可以在列别名中使用空格,但必须用双引号括起来(即end "In waiting"

    【讨论】:

      猜你喜欢
      • 2014-08-21
      • 2021-07-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多