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
相关产品推荐
相关产品推荐

