SQl使用IIF比较同一行中的2个值

时间:2015-03-03 18:03:40

标签: sql ms-access iif

我在MS Access中使用SQL并且需要连续比较2个值以确定第3个字段的结果。 " Yearmove"字段在所有情况下都没有值。这是我正在运行的测试代码

SELECT z.SCHOOL, z.Year as Year,  ProgBuild.BldgNo, ProgMoveBuild.yearmove AS Yearmove,
IIF([Year]=[Yearmove], 1, 0) AS Result

在" Yearmove"的情况下,结果很好。为空,并按预期显示0。任何地方" Yearmove"有一个数字,结果字段读取" #ERROR",所以当条件满足时和不满足时。我已经尝试过填充"年份"带有文字的字段(例如" 2014")和非文字的字段(例如2014)但获得相同的结果。所有数据均为数字。 以下是结果的一部分:

SCHOOL  Year    BldgNo  Yearmove    Result
254     2014     254                   0
256     2014     256                   0
260     2014     260                   0
261     2014     261                   0
262     2014     202                   0
301     2014     301                   0
307     2014     307     2019        #ERROR
313     2014     313     2019        #ERROR
314     2014     314                   0
321     2014     321                   0
322     2014     322                   0

1 个答案:

答案 0 :(得分:1)

此查询引发错误,"数据类型不匹配的条件表达式"

SELECT IIf('2014'=2014, 1, 0)

所以我怀疑你的 Year yearmove 字段是不同的数据类型:一个是数字;另一个是文字。

找出您正在处理的数据类型......

SELECT
    z.Year,
    TypeName(z.Year) AS TypeOfYear,
    ProgMoveBuild.yearmove,
    TypeName(ProgMoveBuild.yearmove) AS TypeOfyearmove
FROM [whatever you have now as your data source(s)]

如果更改其中一个字段的数据类型不实用,则可以将字段的值转换为查询中IIf条件的另一个类型。 CStr()会将数值转换为字符串。并且Val()会将字符串值强制转换为数字。但是,当你给它们Null时,这些函数中的任何一个都会抱怨。因此,在将值提供给Nz()CStr()之前,您可以使用Val()替换其他内容为Null。