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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 12:02:29