您能否告诉我为什么我从以下代码得到的结果不正确。
我有2个字段名,一个名为CheckAmount,另一个名为ckeckNumber。
varchar(25)的CheckNumber和checkAmount属于Money数据类型。
每当将支票金额插入数据库时,也会插入相关的支票号码。
但是,插入现金时,checkNumber列为空白。
当我使用以下代码将chas插入cashAmount colum时,我正尝试将“现金支付”插入CHeck Number列的空白列:
select
CASE
WHEN checknumber ='' AND isnull(checkAmount ,'0.0') is not null
THEN 'Cash Payment'
ELSE checknumber
END As checknumber
from mytable
问题是即使检查号码列不为空(不一定为空),现金金额不为空(我们再也不是在谈论Null),那么代码仍会插入“现金支付”
有什么想法吗?如果需要,我可以进一步解释;我不想太啰嗦。
25411025 25411025 16 1.00 1.0000
25411026 25411026 16 2.00 2.0000
x 0 0.00 0.0000
x 0 0.00 0.0000
x 0 0.00 0.0000
ClientID CheckNumber CheckAmount CashAmount
========== =========== =========== ==========
0000000340 25411025 1.00 0.00
0000000340 25411026 2.00 0.00
0000000340 0.00 3.00
0000000340 0.00 15.00
0000000340 0.00 0.00
答案 0 :(得分:1)
isnull(checkAmount, '0.0')
会将null checkAmount数量转换为'0.0',所以我看不到结果如何为null。案例陈述的那部分将始终评估为真。
您确定不希望该部分阅读:
...AND isnull(checkAmount, '0.0') = '0.0'
或者我不理解你的问题?
<强>更新强>
根据您的评论我认为您想要验证cheknumber是否为空且 cashAmount 列不为零:
select
CASE
WHEN isnull(checknumber, '') = '' AND isnull(cashAmount, 0) <> 0
THEN 'Cash Payment'
ELSE checknumber
END As checknumber
from mytable
希望这是正确的。
答案 1 :(得分:0)
对于“错误”的行,这会产生什么结果?
SELECT
checknumber,
cn_fallback = COALESCE(NULLIF(RTRIM(checknumber), ''), 'x'),
cn_length = DATALENGTH(checknumber),
checkAmount,
ca_fallback = COALESCE(checkAmount, 0.0)
FROM mytable;
此查询是否会产生您所追求的结果?当“没有支票而且没有现金”时,我仍然想知道你是否想在第二个检查编号栏中找到一个空字符串:
SELECT *, CASE
WHEN RTRIM(checknumber) = ''
AND CheckAmount = 0
AND CashAmount > 0
THEN 'Cash Payment'
ELSE checknumber
END As checknumber
FROM dbo.mytable;
答案 2 :(得分:0)
此:
WHEN checknumber ='' AND isnull(checkAmount ,'0.0') is not null
THEN 'Cash Payment'
ELSE checknumber
要选择您指示它的方式应该如下所示:
SELECT
ClientID
,CheckNumber
,CASE WHEN ISNULL(CheckNumber,'') <> '' THEN CheckAmount ELSE 0 END AS CheckAmount
,CASE WHEN ISNULL(CheckNumber,'') = '' THEN CashAmount ELSE 0 END AS CashAmount
FROM dbo.myTable
就这么简单......要么有支票号码,要么没有;无论是现金还是现金。