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

SQL Server中SUBSTRING()函数在SELECT与WHERE子句中表现异常问题

SQL Server中基于连字符间子串过滤行的问题处理

我有一个包含server列的表,数据如下:

server
SLQ-ABCD-001
SLQ-ABCA-002
SLP-DBMSA-003
SLD-ABC-004
SLS-123456-005

我需要基于server列两个连字符之间的子串过滤行,已知第一个连字符前固定有3个字符,第二个连字符后固定有3个字符。

我尝试了两种写法:

  • 写法1:AND substring(server, 5, (len(server)-8)) in ('ABC', 'DBMSA')
  • 写法2:AND substring(server, charindex('-', server)+1,(charindex('-',server, charindex('-', server)+1)-(charindex('-', server)+1))) in ('ABC', 'DBMSA')

这两种写法在SELECT子句中能正常获取预期子串,但在WHERE子句中执行时会报错:

Invalid length parameter passed to the LEFT or SUBSTRING function.

由于需要匹配的字符组合是动态解析的列表,无法使用更简单的AND server like '%ABC%'写法。请问在SQL Server中如何实现这类过滤?


编辑
经@DaleK提醒,问题根源是表中存在长度小于8的无效server名称数据,而我在SELECT子句测试时,其他过滤条件已经排除了这些无效数据。我暂时通过嵌套查询解决:

SELECT *
from
(SELECT *
from my_original_table
where
-- 所有用于排除无效数据的其他过滤条件
) my_filtered_table
where substring(server, 5, (len(server)-8)) in ('ABC', 'DBMSA');

针对“问题重复”的质疑:另一问题的报错出现在SELECT语句中,而我的情况是SELECT子句正常执行,仅WHERE子句报错。目前@Isolated提供的解决方案已完美生效!


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 17:15:54