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

如何提取SQL字段中'- '后的首个单词?语句报错求助

问题分析与解决方案

原SQL语句的错误点

  • 硬编码CASE条件,仅匹配'853 - RACEWAY SALES'单条记录,无法通用处理其他符合格式的仓库名
  • 使用CHARINDEX('', [Warehouse name])是无效操作:空字符串的索引会返回1,导致长度计算完全错误
  • SUBSTRING的起始位置未跳过"- "字符,会把- 也包含在结果里

正确SQL实现(SQL Server)

要提取"- "之后的首个单词,核心是定位"- "的结束位置,再找到后续第一个空格的位置,以此截取中间内容:

SELECT
    SUBSTRING(
        [Warehouse name],
        -- 定位到"- "之后的起始位置(+2是跳过"-"和空格)
        CHARINDEX('- ', [Warehouse name]) + 2,
        -- 计算截取长度:后续第一个空格位置 - 起始位置
        CASE
            -- 如果"- "后没有空格(即只有一个单词),截取到字符串末尾
            WHEN CHARINDEX(' ', [Warehouse name], CHARINDEX('- ', [Warehouse name]) + 2) = 0
                THEN LEN([Warehouse name]) - (CHARINDEX('- ', [Warehouse name]) + 2) + 1
            ELSE CHARINDEX(' ', [Warehouse name], CHARINDEX('- ', [Warehouse name]) + 2) 
                 - (CHARINDEX('- ', [Warehouse name]) + 2)
        END
    ) AS A
FROM
    YourTable
-- 过滤掉不包含"- "格式的记录,避免报错
WHERE
    [Warehouse name] LIKE '%- %'

简化版本(假设"- "后必有空格分隔单词)

如果能确定所有符合条件的记录中,"- "后都有至少一个空格,可简化为:

SELECT
    SUBSTRING(
        [Warehouse name],
        CHARINDEX('- ', [Warehouse name]) + 2,
        CHARINDEX(' ', [Warehouse name], CHARINDEX('- ', [Warehouse name]) + 2) 
        - (CHARINDEX('- ', [Warehouse name]) + 2)
    ) AS A
FROM
    YourTable
WHERE
    [Warehouse name] LIKE '%- %'

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 16:48:26