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

