zoukankan      html  css  js  c++  java
  • sql语句中使用拼接语句,提示字符串拼接过长的问题处理

    背景:

      项目上最近被要求写一个根据日期统计数据的语句,然后找到我说他们自己写的语句报错了,让我给他们修改下,然后看了他们写的语句,不忍直视,其中里面用到了字符串的拼接,发现给他们之后,报了字符串拼接过长的错误,下面就是相应的解决过程:

    关于字符串拼接函数,用到的基本上都是这2个:

    wm_concat()和listagg(字段,',') within group by(order by ...) 函数

    按照项目上的要求使用这2个函数拼接都可,但是使用习惯了listagg函数(原因是可以进行拼接排序的操作),就使用了此函数完成拼接,但是发现报错了。

    简要语句如下:(子查询)

    (select listagg(to_char(clmc),'、') within group(order by ax_owner) as clmc from  bdc_xxx where slid=a.slid GROUP BY slid) as clmc

    关于字符串拼接过长这个问题,都知道是拼接的字段超出了长度,最大长度4000,但是按照我们的业务来说是不会超出的,检查了他们的数据库,发现是转库的数据,就会导致这个clmc字段长度特别长,通过查找资料发现了一种可直接处理的方式,如下:

    (select rtrim(xmlagg(xmlelement(e,clmc,'、').extract('//text()') order by ax_owner).GetClobVal(),'、') from  bdc_xxx where slid=a.slid GROUP BY slid) as clmc

    这样的话,拼接出来的这个字段就是clob字段了,就能进行下面的操作,这种方式可适用于其他项目;

    但是关于他们项目的问题,个人发现了他们的数据问题其实可以处理的,因为他们的字段中会存在空格的占位符,所以可以对字段进行trim处理,如下:

    (select listagg(trim(to_char(clmc)),'、') within group(order by ax_owner) as clmc from  bdc_xxx where slid=a.slid GROUP BY slid) as clmc

    这样就能满足项目上的需要了;

  • 相关阅读:
    has a / is a 的区别
    Linux头文件作用
    转一篇Decorator模式的讲解文章
    歌手推荐kate st. john
    拷贝构造函数和赋值构造函数声明为私有的作用
    重新认识C++中new的用法
    系统程序员成长计划容器与算法(二)(下)
    深入C++的new
    歌手推荐Cara Dillon
    浅析一道C++设计面试题
  • 原文地址:https://www.cnblogs.com/ammyblog/p/15689335.html
Copyright © 2011-2022 走看看