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

如何正确编写SQL语句提取子字符串中间的可变长度目标值

问题场景
  • 表sales.CustomerSales中存在CustomerId字段,字段典型值为1_Nissan_028、2_Ferrari_035,格式为「前缀_客户名_后缀」,中间客户名部分长度不固定。
  • 需求为提取两个下划线中间的客户名部分,输出为CustomerName字段。
  • 原有查询逻辑存在错误,返回结果会出现多余后缀下划线(如Nissan_)、内容截断(如Ferrar)的问题,原有错误代码如下:
SELECT cast(
        SUBSTRING(
        CustomerId,
        6,
        charindex('_', CustomerId)
        ) as nvarchar(32)
    ) as CustomerName
  
FROM [sales].[CustomerSales] 
错误原因

原有写法两个核心截取参数都存在问题:

  1. 截取起始位置硬编码为6:当前缀长度不是1位(比如值为12_BYD_103)时起始位置直接偏移,就算前缀是1位,第一个下划线在第2位,正确起始位置应该是第一个下划线的后一位,不能写死固定值。
  2. 截取长度直接取第一个下划线的位置:既没有计算和起始位置的偏移量,也没有定位到第二个下划线的位置,必然会出现截取长度不对的问题。
正确SQL写法(适配SQL Server环境,匹配现有语法特征)

核心逻辑是先分别定位两个下划线的位置,再计算中间内容的截取范围:

SELECT 
  CAST(
    SUBSTRING(
      CustomerId,
      -- 第一个下划线的下一位,作为截取起点
      CHARINDEX('_', CustomerId) + 1,
      -- 截取长度 = 第二个下划线位置 - 第一个下划线位置 - 1
      CHARINDEX('_', CustomerId, CHARINDEX('_', CustomerId) + 1) - CHARINDEX('_', CustomerId) - 1
    ) AS NVARCHAR(32)
  ) AS CustomerName
FROM [sales].[CustomerSales]

逻辑验证(以值2_Ferrari_035为例):

  • 第一个下划线位置为2,截取起点为3
  • 从位置3开始查找第二个下划线,得到位置为9
  • 截取长度为9-2-1=6,从位置3开始取6个字符,正好得到Ferrari,无多余字符也不会截断。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.31 21:45:38