如何提取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
相关产品推荐
相关产品推荐

