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

SQL Server CASE语句THEN子句设Debit>0条件报错求解决

解决SQL Server CASE语句THEN子句放条件的报错问题

兄弟,你遇到的这个问题我之前也踩过坑!SQL Server的CASE表达式对THEN子句的返回值有严格要求——它必须是一个具体的标量值(比如字符串、数字、日期等),而不能直接写JDT1.Debit > 0这种布尔判断表达式。因为SQL Server里没有直接支持返回原生布尔类型的语法,所以这么写会直接报错。

下面根据你的需求给出几种可行的解决方案:

方案1:返回文本形式的判断结果

如果只是想展示Debit是否大于0的描述,可以在THEN里嵌套一个CASE来返回字符串:

CREATE PROCEDURE [dbo].[Supplier_Enquiry] 
AS 
BEGIN 
    SELECT 
        OCRD.CardCode, 
        OCRD.CardName, 
        OCRD.GroupCode, 
        OCRG.GroupName, 
        OCRD.CreditLine, 
        ISNULL(JDT1.FCCurrency,'LKR') AS Currency, 
        JDT1.RefDate, 
        CAST(OJDT.BaseRef AS int) AS 'Document Number', 
        CASE 
            WHEN JDT1.TransType = 18 THEN 'Invoice' 
            WHEN JDT1.TransType = 19 THEN 'Credit Memo' 
            WHEN JDT1.TransType = 46 THEN 
                -- 嵌套CASE判断Debit是否大于0,返回文本结果
                CASE WHEN JDT1.Debit > 0 THEN 'Debit金额大于0' ELSE 'Debit金额不大于0' END
            -- 补充你的其他TransType分支
            ELSE '未知交易类型' -- 建议添加ELSE分支避免返回NULL
        END AS TransactionTypeDesc
        -- 你的其他SELECT字段
    FROM 
        -- 你的表连接逻辑(比如OCRD JOIN OCRG ON ... JOIN JDT1 ON ... JOIN OJDT ON ...)
END

方案2:返回数字形式的布尔标记(1/0)

如果需要用数字来表示判断结果(1代表真,0代表假),可以用IIF函数(SQL Server 2012及以上版本支持),或者嵌套CASE:

CASE 
    WHEN JDT1.TransType = 18 THEN 'Invoice' 
    WHEN JDT1.TransType = 19 THEN 'Credit Memo' 
    WHEN JDT1.TransType = 46 THEN IIF(JDT1.Debit > 0, 1, 0)
    ELSE '未知交易类型'
END AS IsDebitPositive

如果要兼容更低版本的SQL Server,用嵌套CASE替代IIF:

CASE 
    WHEN JDT1.TransType = 18 THEN 'Invoice' 
    WHEN JDT1.TransType = 19 THEN 'Credit Memo' 
    WHEN JDT1.TransType = 46 THEN 
        CASE WHEN JDT1.Debit > 0 THEN 1 ELSE 0 END
    ELSE '未知交易类型'
END AS IsDebitPositive

方案3:基于Debit条件执行不同业务分支

如果当TransType=46时,你还需要根据Debit是否大于0返回不同的业务描述,可以把嵌套CASE写得更细致:

CASE 
    WHEN JDT1.TransType = 18 THEN 'Invoice' 
    WHEN JDT1.TransType = 19 THEN 'Credit Memo' 
    WHEN JDT1.TransType = 46 THEN 
        CASE 
            WHEN JDT1.Debit > 0 THEN '付款凭证(Debit为正)'
            WHEN JDT1.Debit = 0 THEN '无金额变动凭证'
            ELSE '退款凭证(Debit为负)'
        END
    ELSE '未知交易类型'
END AS TransactionDetail

额外提醒

原来的CASE JDT1.TransType WHEN 46 THEN ...这种简单CASE写法,换成WHEN JDT1.TransType = 46 THEN ...的搜索CASE写法,会更灵活,尤其是需要在分支里做复杂判断的时候。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 08:26:45