SQL / MS Access - 为啥这个 CASE 不起作用?

Posted

技术标签:

【中文标题】SQL / MS Access - 为啥这个 CASE 不起作用?【英文标题】:SQL / MS Access - why isn't this CASE working?SQL / MS Access - 为什么这个 CASE 不起作用? 【发布时间】:2013-07-02 17:33:23 【问题描述】:

我正在编写一个查询,它根据名为“USERDATE”的用户定义日期确定要使用的价格。当我运行它时,我得到一个“表达式中的语法错误(缺少运算符)”。我希望选择的价格是稍后在查询中使用的“UNIT_AMT”。

SELECT MDDB.NDC, CARRIER.GROUP_ID, [USERDATE] AS USERDATE, MDDB.CODE, CARRIER.DUR_MU_R, CARRIER.FEE_BR, CARRIER.FEE_GR, CARRIER.AWP_BR, CARRIER.AWP_GR, CARRIER.DUR_MU_M, CARRIER.FEE_BM, CARRIER.FEE_GM, CARRIER.AWP_BM, CARRIER.AWP_GM, MDDB.AWP_UNIT_AMT, 

CASE
WHEN USERDATE >= AWP_EFF_DATE THEN AWP_UNIT_AMT
WHEN USERDATE >= AWP_1ST_OLDEST_EFF_DATE AND USERDATE < AWP_EFF_DATE THEN AWP_1ST_OLDEST_UNIT_AMT
WHEN USERDATE >= AWP_2ND_OLDEST_UNIT_AMT AND USERDATE < AWP_1ST_OLDEST_UNIT_AMT THEN AWP_2ND_OLDEST_UNIT_AMT
WHEN USERDATE >= AWP_3RD_OLDEST_UNIT_AMT AND USERDATE < AWP_2ND_OLDEST_UNIT_AMT THEN AWP_3RD_OLDEST_UNIT_AMT
WHEN USERDATE >= AWP_4TH_OLDEST_UNIT_AMT AND USERDATE < AWP_3RD_OLDEST_UNIT_AMT THEN AWP_4TH_OLDEST_UNIT_AMT
WHEN USERDATE >= AWP_5TH_OLDEST_UNIT_AMT AND USERDATE < AWP_4ST_OLDEST_UNIT_AMT THEN AWP_5TH_OLDEST_UNIT_AMT
ELSE AWP_UNIT_AMT
END AS UNIT_AMT,

((([UNIT_AMT]*[QTY])*((100+[AWP_GR])/100))+[DUR_MU_R]+[FEE_GR]) AS [GR PRICE], 
((([UNIT_AMT]*[QTY])*((100+[AWP_BR])/100))+[DUR_MU_R]+[FEE_BR]) AS [BR PRICE], 
((([UNIT_AMT]*[QTY])*((100+[AWP_GM])/100))+[DUR_MU_M]+[FEE_GM]) AS [GM PRICE], 
((([UNIT_AMT]*[QTY])*((100+[AWP_BM])/100))+[DUR_MU_M]+[FEE_BM]) AS [BM PRICE]
FROM MDDB_MASTER AS MDDB, CARRIER_GROUP AS CARRIER
WHERE (((MDDB.NDC)="41520091574") AND ((CARRIER.GROUP_ID)="709608"));

感谢您的宝贵时间和帮助!

【问题讨论】:

MS Access没有CASE表达式,需要使用IIF()函数查看。 那会解释的:) 【参考方案1】:

由于 Access SQL 不支持CASE ... WHEN,您可以使用嵌套的IIf() 表达式。然而,有这么多条件,嵌套的IIf() 将具有挑战性。在这种情况下,您可能会发现Switch() 更易于使用。

Switch(
    USERDATE >= AWP_EFF_DATE, AWP_UNIT_AMT,
    USERDATE >= AWP_1ST_OLDEST_EFF_DATE AND USERDATE < AWP_EFF_DATE, AWP_1ST_OLDEST_UNIT_AMT,
    USERDATE >= AWP_2ND_OLDEST_UNIT_AMT AND USERDATE < AWP_1ST_OLDEST_UNIT_AMT, AWP_2ND_OLDEST_UNIT_AMT,
    USERDATE >= AWP_3RD_OLDEST_UNIT_AMT AND USERDATE < AWP_2ND_OLDEST_UNIT_AMT, AWP_3RD_OLDEST_UNIT_AMT,
    USERDATE >= AWP_4TH_OLDEST_UNIT_AMT AND USERDATE < AWP_3RD_OLDEST_UNIT_AMT, AWP_4TH_OLDEST_UNIT_AMT,
    USERDATE >= AWP_5TH_OLDEST_UNIT_AMT AND USERDATE < AWP_4ST_OLDEST_UNIT_AMT, AWP_5TH_OLDEST_UNIT_AMT,
    True, AWP_UNIT_AMT
) AS UNIT_AMT

【讨论】:

它们都是日期/时间类型。我想我只是在[USERDATE] AS USERDATE 中有错字。它现在似乎正在工作:D

以上是关于SQL / MS Access - 为啥这个 CASE 不起作用?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的 MS Access 查询不可更新

MS-Access 获取特定订单日期的产品价格

MS access 2010 SQL查询帮助

MS Access SQL 查询中的这个前缀 (ABF:) 是啥意思?

为啥要克隆 MS-Access 记录集?

由于“SQL 语法”错误,无法插入 MS Access [关闭]