【问题标题】:Syntax Error issues around Case WhenCase When 的语法错误问题
【发布时间】:2017-11-09 13:54:42
【问题描述】:

我正在尝试为 Microsoft Access 编写以下查询,并且在此处遇到关于最后三个字符的问题,有人可以告诉我我的 Access 语法有什么问题吗:

SELECT DISTINCT Searches.Search ,IIF(Chemical_Names.Category IS NOT NULL, Chemical_Names.Category, IIF(CAS_Numbers.Category IS NOT NULL , CAS_Numbers.Category, IIF(Brand_Name.Category IS NOT NULL, Brand_Name.Category, IIF(PART.Category IS NOT NULL, PART.Category,CAT.Category)))) 作为类别 从搜索 左连接 (从 Cat1 联合中选择 * 从 Cat2 联合中选择 * 从 Cat3 UNION 中选择 * SELECT * FROM Cat4) 作为 CAT 在 搜索.搜索 = CAT.搜索 左连接 (从第 1 部分联合中选择 * 从第 2 部分联合中选择 * 从第 3 部分联合中选择 *
SELECT * FROM Part4) 作为 PART 在 Searches.Search = PART.Search 左连接 供应商名称 在 搜索.搜索 = 供应商名称.搜索 左连接 化学名称 在 Searches.Search = Chemical_Names.Search 左连接 化学名称 在 Searches.Search = CAS_Number.Search 左连接 品牌 在 Searches.Search = Brand_Name.Search;

【问题讨论】:

  • 这是哪个 RDBMS? SQL Server?
  • @GregoryHigley 是 MS Access,作为标签和文本状态。
  • 我将标签更正为ms-accessaccess 清如泥。
  • 您的代码中没有 CASE WHEN,并且 SWITCH 在我见过的任何版本的 Access SQL 中都不可用。您是否正在寻找 IIF()(或 IFF() - 我已经很久没有编写任何 Access SQL)了?
  • 尝试使用IIF(situation, do-this-when-true, do-this-when-false) 而不是switch。示例见stackoverflow.com/questions/9310098/…

标签: sql ms-access


【解决方案1】:

我认为您可以尝试使用Nz() 函数有条件地显示您的偏好链中的第一个非空类别:

SELECT DISTINCT
    Nz(Chemical_Names.Category,
        Nz(CAS_Number.Category,
            Nz(Brand_Name.Category,
                Nz(PART.Category, CAT.Category)))) AS Category
FROM Searches
...

Nz() 函数是大多数其他数据库中 COALESCE() 的 Access 版本。

您也可以处理这种使用IIF(),这是CASE 表达式的Access 版本:

SELECT DISTINCT
    IIF(Chemical_Names.Category IS NOT NULL, Chemical_Names.Category,
        IIF(CAS_Number.Category IS NOT NULL, CAS_Number.Category,
            IIF(Brand_Name.Category IS NOT NULL, Brand_Name.Category,
                IIF(PART.Category IS NOT NULL, PART.Category, CAT.Category)))) AS Category
FROM Searches
...

【讨论】:

  • 什么相当于Case When?我想尽量保留我所拥有的东西,除非有必要对其进行更改以使其在访问中工作。
  • @mkheifetz 您还可以使用IIF 函数,它是您从大多数其他SQL 风格中知道的CASE 表达式的Access 版本。
  • 是的,我试着像上面的开关一样这样做,它给了我一个语法错误,就像上面那个一样,除了出于某种原因使用 IIF 语法
  • 我的查询的其他部分是否还有其他错误,因为该更改仍然告诉我我有语法错误...
【解决方案2】:

如果我理解您想要的结果,应按如下方式应用 Switch: Switch(Chemical_Names.Category IS NOT NULL, Chemical_Names.Category, CAS_Namber.Category IS NOT NULL, CAS_Number.Category, Brand_Name.Category IS NOT NULL, Brand_Name.Category, PART.Category IS NOT NULL, PART.Category, 1=1, CAT.Category) AS Category

【讨论】:

  • 我刚刚尝试过这样做,但它仍然给出相同的消息,即存在语法错误......不知道该怎么办
  • 如果删除整个计算字段,查询是否运行?如果没有,那么它可能是你的加入。最简单的事情可能是使用查询设计器重建它。如果它确实在没有计算字段的情况下运行,则一次重建一对 switch 语句。
  • 计算字段是什么意思?你如何重建,这是做什么的?
  • 计算字段 = 公式 = 整个 'switch' 语句。重建 = 重建/重新组装 = 一块一块地重新开始(一张一张地)。首先确保连接工作,没有开关,iif 或您选择使用的任何东西。然后你可以把公式一块一块地拼起来。
猜你喜欢
  • 1970-01-01
  • 2012-08-21
  • 2022-08-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多