SQL Server 2012中如何忽略正数值行,仅保留负数值记录的查询实现
嘿,这个问题我帮你捋一捋!
首先明确一点:CASE语句的ELSE子句没办法直接过滤掉整行——它只能控制当条件不满足时[Open_Amount]字段返回什么值(比如null、0或者其他),但无法让整个行不被查询返回。要实现“忽略正数值所在行”的需求,核心是用WHERE子句来筛选数据,而不是靠CASE的分支。
具体解决方案
既然你只需要保留包含负号的行,直接在WHERE里判断目标字符串片段中是否存在负号即可,这样SQL只会返回符合条件的行,自然就排除了正数值的记录。而且过滤之后,SELECT里的逻辑还能简化不少:
SELECT -- 因为已经通过WHERE过滤出有负号的行,直接处理数值部分并拼接负号即可 '-' + REPLACE(LTRIM(RTRIM(SUBSTRING([TXT], 147, 9))), ',', '') AS [Open_Amount], -- 记得加上你需要的其他字段 [其他字段1], [其他字段2] FROM YourTableName -- 替换成你的实际表名 WHERE -- 判断从第147位开始的10个字符里是否包含负号 CHARINDEX('-', SUBSTRING([Txt], 147, 10)) > 0;
为什么原来的CASE逻辑不需要了?
因为WHERE子句已经提前过滤掉了所有不含负号的行,所以剩下的行必然满足“包含负号”的条件,直接拼接负号+处理后的数值就可以得到正确的[Open_Amount],不需要再用CASE做判断了。
补充说明
如果你坚持想保留CASE语句(比如后续可能有其他逻辑扩展),也可以这么写,但WHERE子句还是必须的:
SELECT CASE WHEN CHARINDEX('-', SUBSTRING([Txt], 147, 10)) > 0 THEN '-' + REPLACE(LTRIM(RTRIM(SUBSTRING([TXT], 147, 9))), ',', '') END AS [Open_Amount], [其他字段] FROM YourTableName WHERE CHARINDEX('-', SUBSTRING([Txt], 147, 10)) > 0;
不过这种写法有点冗余,因为WHERE已经做了相同的判断,所以第一种简化写法更高效。另外要注意确认SUBSTRING的参数是否符合你的实际数据:你用SUBSTRING([Txt],147,10)检查负号,然后取SUBSTRING([TXT],147,9)作为数值部分,要确保这个长度设置是准确的,避免截取到错误的字符。
内容的提问来源于stack exchange,提问作者Git_Hub-96
相关产品推荐
相关产品推荐

