You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在SQL中提取每个单词的首字母?现有查询存在重复问题

提取单词首字母的SQL查询问题修复

问题描述

我写了一个SQL查询用来提取字符串中每个单词的首字母,处理包含4个单词的字符串时正常,但处理仅含2个单词的字符串时,会重复第二个单词的首字母。

原查询代码

select
  substring(column_name, 1, 1) + 
  case 
    when 0 <>  charindex(' ', column_name) + 1
      then substring(column_name, charindex(' ',column_name) + 1, 1)
    else ''
  end +
  case 
    when 0 <>  charindex(' ', column_name, charindex(' ', column_name) + 1) 
      then substring(column_name, charindex(' ', column_name, charindex(' ', column_name) + 1) + 1, 1)
    else ''
  end + 
  case
    when 0 <> charindex(' ', column_name, charindex(' ', column_name, charindex(' ', column_name) + 1) + 1)
      then substring(column_name, charindex(' ', column_name, charindex(' ', column_name, charindex(' ', column_name) + 1) + 1) + 1, 1) 
    else '' 
  end
from table_name

问题原因

原查询第一个CASE的条件逻辑错误:0 <> charindex(' ', column_name) + 1这个判断永远为真——即使找不到空格(charindex返回0),0+1=1也不等于0;找到空格时,返回的位置+1肯定大于0。这导致第二个首字母会被强制拼接。同时后续CASE的判断逻辑在无对应空格时,会错误提取重复的首字母。

修正方案

方案1:修复原查询的条件逻辑

调整每个CASE的判断条件,仅当存在对应空格时才拼接对应首字母:

select
  substring(column_name, 1, 1) + 
  -- 仅当存在第一个空格时,拼接第二个单词首字母
  case 
    when charindex(' ', column_name) <> 0
      then substring(column_name, charindex(' ', column_name) + 1, 1)
    else ''
  end +
  -- 仅当存在第二个空格时,拼接第三个单词首字母
  case 
    when charindex(' ', column_name, charindex(' ', column_name) + 1) <> 0
      then substring(column_name, charindex(' ', column_name, charindex(' ', column_name) + 1) + 1, 1)
    else ''
  end + 
  -- 仅当存在第三个空格时,拼接第四个单词首字母
  case
    when charindex(' ', column_name, charindex(' ', column_name, charindex(' ', column_name) + 1) + 1) <> 0
      then substring(column_name, charindex(' ', column_name, charindex(' ', column_name, charindex(' ', column_name) + 1) + 1) + 1, 1)
    else '' 
  end
from table_name

方案2:通用型首字母提取(支持任意数量单词)

如果你的SQL环境支持字符串拆分函数,可以用更灵活的方法,避免硬编码单词数量:

SQL Server 示例

select 
  string_agg(substring(value, 1, 1), '') as initials
from table_name
cross apply string_split(column_name, ' ')
group by column_name

PostgreSQL 示例

select 
  string_agg(left(unnest(string_to_array(column_name, ' ')), 1), '') as initials
from table_name

内容的提问来源于stack exchange,提问作者Yasir

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 14:30:53