如何编写SQL IF条件语句实现字段按需添加空格后拼接合并
问题场景
- 库表存在
name_line1、name_line2两个VARCHAR(30)字段,数据来源是前端单输入项name通过substr函数拆分存入,其中name_line1存储时不会保留尾随空格。 - 固定加空格的拼接方案不适用:拆分点可能落在单词中间,例如下方示例中拆分点落在
Stationaries的n字符位置,固定加空格会把完整单词拆成两个带空格的部分:
HERE Experimental unit 1998 Station|aries Sdn Bhd. name_line1 name_line2
- 实现目标:编写SQL完成两个字段的合并,按业务规则判断是否需要在两字段间拼接空格,比如当
name_line1长度不为30且name_line2存在有效内容时加空格,同时兼容拆分点落在单词中间的场景。
实现方案
核心判断逻辑不需要依赖复杂的词典,只需要根据拆分位置的字符特征判断即可:
- 如果
name_line2是NULL或者全为空格,直接返回RTRIM(name_line1)即可,不需要拼接 - 如果
name_line1去尾随空格后长度小于30,说明原名称长度没撑满第一行的存储上限,拆分点必然在单词间隔处,拼接时补单个空格 - 如果
name_line1去空格后长度刚好为30,说明是被字段长度截断的,此时看两个字段邻接位置的字符:如果name_line1最后一个字符、name_line2第一个字符都不是空格,说明拆分点落在单词中间,直接拼接不需要加空格;否则补单个空格 - 拼接前统一对
name_line1做尾随空格去除、对name_line2做前导空格去除,避免出现连续空格
对应可直接使用的SQL代码如下:
SELECT RTRIM(name_line1) || CASE WHEN TRIM(name_line2) IS NULL OR TRIM(name_line2) = '' THEN '' WHEN LENGTH(RTRIM(name_line1)) < 30 THEN ' ' WHEN SUBSTR(RTRIM(name_line1), -1) != ' ' AND SUBSTR(LTRIM(name_line2), 1, 1) != ' ' THEN '' ELSE ' ' END || LTRIM(name_line2) AS full_name FROM your_table_name;
效果验证
- 拆分落在单词中间的场景:
name_line1='Experimental unit 1998 Station'、name_line2='aries Sdn Bhd.',拼接结果为Experimental unit 1998 Stationaries Sdn Bhd.,无多余空格 - 拆分落在单词间隔的场景:
name_line1='Experimental unit 1998'(长度不足30)、name_line2=' Stationaries Sdn Bhd.',拼接结果为Experimental unit 1998 Stationaries Sdn Bhd.,无连续空格 - 第二行无有效内容的场景:
name_line1='Test Company'、name_line2=' ',拼接结果为Test Company,无多余尾随空格
内容的提问来源于stack exchange,提问作者pebble unit
相关产品推荐
相关产品推荐

