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

求助:SQL提取下划线后文本的通用方案(解决RIGHT函数参数错误)

问题分析与解决方案

首先你这里有几个明显的问题:

  1. 需求描述和例子矛盾:你说要提取下划线之后的文本,但例子是把Segment_Name转成Segment——这明显是取下划线之前的内容,下面两种情况的解决方案都给你整理好了;
  2. 你的SQL里误把下划线'_'写成了减号'-',直接导致CHARINDEX找不到目标字符,返回0后让RIGHT的长度参数变成-1,触发报错;
  3. 没处理字符串中不存在下划线的情况,这会让RIGHT函数的长度参数非法。

情况1:提取下划线之前的文本(对应你的例子Segment_Name→Segment)

用LEFT配合CHARINDEX,同时给字符串拼接下划线,避免无目标字符时的错误:

SELECT 
    s.segment_name,
    LEFT(s.segment_name, CHARINDEX('_', s.segment_name + '_') - 1) AS extracted_part
FROM 
    [prod_idw_mart].[timesheet].[dim_segment] s

原理:给每个字符串末尾加个下划线,确保CHARINDEX至少返回1,减1后不会出现负数。如果原字符串没有下划线,CHARINDEX返回的是原字符串长度+1,减1正好是原字符串长度,LEFT会返回整个原字符串。

情况2:提取下划线之后的文本(比如Segment_Name→Name)

用CASE判断是否存在下划线,避免非法长度参数:

SELECT 
    s.segment_name,
    CASE
        WHEN CHARINDEX('_', s.segment_name) > 0 THEN RIGHT(s.segment_name, LEN(s.segment_name) - CHARINDEX('_', s.segment_name))
        ELSE '' -- 如果不需要空字符串,可以改成s.segment_name返回原内容
    END AS extracted_part
FROM 
    [prod_idw_mart].[timesheet].[dim_segment] s

你之前的错误原因

  • 把下划线写成了减号'-',导致CHARINDEX返回0,RIGHT的长度参数变成-1,触发Invalid length parameter错误;
  • 试图用>0替换-1是语法错误,RIGHT的第二个参数必须是数值,不能直接写条件判断。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 16:32:42