拼接字符串SQL需求

Posted bisal

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了拼接字符串SQL需求相关的知识,希望对你有一定的参考价值。

同事提了个需求,表中一个字段,存储格式例如abc_x_cd,需要通过SQL拼接出另外一个值,例如abc_x_cd abc x cd,即根据原始值,按照"_"分割,按照每个部分,再通过空格,和原始值拼接。

mysql可以通过split(column,'_') as column1,然后concat(column,' ',column1) as newcolumn得到值。

但是在Oracle,没有split函数,如何实现需求?

创建测试表,

create table t (c1 varchar2(25));
insert into t values('abc_x_cd');
select * from t;

方案1

利用正则regexp_substr和listagg,能实现这个需求,

select c1 || ' ' || c2
from t, (select listagg(regexp_substr(c1, '[^_]+', 1, rownum),' ') within group (order by rownum) as c2 from t
connect by rownum <= length(c1) - length(replace(c1, '_', ''))+1) a;

regexp_substr定义如下,

REGEXP_SUBSTR(source_char, pattern
              [, position
                 [, occurrence
                    [, match_param
                       [, subexpr
]
                    ]
                 ]
              ]
             )

针对值abc_x_cd,

regexp_substr(c1, '[^_]+', 1, rownum)得到的是"abc"、"x"、"cd"。

connect by rownum <= length(c1) - length(replace(c1, '_', ''))+1,循环次数=几个分隔符+1。

利用listagg做列转行,设置within group (order by rownum)保证按照行的顺序拼接成"abc x cd"。

再通过||和原始字段进行拼接,就得到了"abc_x_cd abc x cd"。

方案2

方案1的思路,其实是按照MySQL的split函数的逻辑考虑的,按照某个字符进行分隔,分隔出的几个字符串再通过列转行进行拼接,但其实这就进入了一种定势思维。

再回到需求,需要根据"abc_x_cd"得到"abc_x_cd abc x cd",其实就是怎么从"abc_x_cd"得到"abc x cd",这个不就是将"_",替换成" "?

只需要使用replace函数,就可以实现,

select c1 || ' ' || replace(c1, '_', ' ') from t;

因此,对待一个问题,有时候需要发散一下,有时候需要回到需求原点,这就相当于你要翻过一扇大门的时候,发现钥匙就在兜里装着。

近期更新的文章:

《SQL Cookbook》 - 第二章 查询结果排序

2021雷军年度演讲 - 我的梦想,我的选择

梅西 ≠ 一人一城?

小白学习MySQL - 表空间碎片整理方法

Oracle字符串类型扩容隐患

文章分类和索引:

《公众号800篇文章分类和索引

以上是关于拼接字符串SQL需求的主要内容,如果未能解决你的问题,请参考以下文章

MYBATIS05_ifwherechoosewhentrimsetforEach标签sql片段

mybatis入门基础----动态SQL

明细表1字符串拼接合并插入到明细表2SQL输出过程记录

C# 字符串拼接Sql语句复杂的取变量值问题....

SQL语句中有关单引号双引号和加号的问题

mysql-sql数据拼接