今天运行程序发现了一个小bug.是之前用T-sql做的连接改用了Access,使用ISNULL,出现了参数个数不对等问题。
之前的SQL语句是:
select ISNULL(SUM(case costTypewhen '收入' then coseMOney else 0 end),0)
as 收入,
ISNULL(SUM(casecostType when '支出' then coseMOney else 0 end),0)
as支出
from KeepAccounts_AccountsInfo where 1=1
修改后的是:
selectISNULL(SUM(iff(costType='收入',coseMOney,0)),0,SUM(iff(costType='收入',coseMOney,0)
as 收入,
ISNULL(SUM(iff(costType='支出',coseMOney,0)),0,SUM(iff(costType='支出',coseMOney,0)
as支出
from KeepAccounts_AccountsInfo where 1=1
原因一:
在access中,case用iff代替;
case语句格式:case [字段名] when‘值’then[value1]else[value2]end
解析:当[字段名]=‘值’返回的值是[value1] 否则值是[value2]
iff语句格式:iff([字段名]=‘值’, [value1],[value2] )
解析:当[字段名]=‘值’返回的值是[value1] 否则值是[value2]
原因二:
IsNull(expression)
必选的 expression参数?(参数:为操作、事件、方法、属性、函数或过程提供信息的值。)是 Variant?(Variant数据类型:变量的默认数据类型,如果 Def type 语句没有生效,则该数据类型没有类型声明字符。Variant可以存储数值、字符串、日期/时间、Null 或 Empty 数据。)类型的值,其中包含数值表达式?(数字表达式:计算结果为数字的任何表达式。表达式可以是变量、常数、函数和运算符的任意组合。)或字符串表达式?(字符串表达式:任一求值为一列连续字符的表达式。表达式的元素可以是:返回字符串或字符串Variant (VarType 8) 的函数;字符串字面值、常量、变量或 Variant。)。
注解
如果 expression 为 Null,则 IsNull 返回True;否则 IsNull 返回 False。如果 expression包含多个变量?(变量:已命名存储位置,所包含的数据能够在程序执行过程中发生变动。每一变量都有名称,在它的作用域级别范围内能够唯一标识该变量。既可以指定数据类型,也可以不指定。),则构成该表达式的任何变量中的Null 都会导致整个表达式返回 True。
Null 值表示 Variant 类型的值包含无效数据。Null与空?(空白:未初始化的 Variant 变量(它返回为 0 的 VarType)的状态。请不要与Null(指示无效数据的变量状态)、包含零长度字符串 (" ")的变量或等于零的数字变量混淆。)不同,后者表示尚未初始化变量。它也与零长度字符串 ("")不同,后者有时指空字符串。
要点 使用 IsNull函数确定表达式是否包含 Null 值。在有些情况下(如 If Var = Null 和 If Var<> Null),您可能预期其值为 True 的表达式始终为False。这是因为任何包含 Null 的表达式本身就为 Null,因此该表达式为 False。
解决办法:
Access也有IsNull函数,但意义和参数却和T-SQL中的不同。
在T-SQL(也就是SQLServer所支持的SQL语言)中,IsNull的作用是把空值替代成指定的值。然而在Access中,IsNull的作用仅仅是判断是否为空值,而且参数的个数也和T-SQL中的不一样,只有一个输入参数。
庆幸的是Access支持iif,所以可以这样去替代:
Select iif(IsNull( express ), value1, value2 ) FromTableName
iif(IsNull( express ), value1, value2)
相当于:
If express Is Null Then
Return value1
Else
Return value2
End if