案例陈述的价值分配

时间:2011-09-14 02:15:45

标签: sql sql-server-2005

您能否告诉我为什么我从以下代码得到的结果不正确。

我有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

3 个答案:

答案 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

就这么简单......要么有支票号码,要么没有;无论是现金还是现金。