【问题标题】:Does MS Access support "CASE WHEN" clause if connect with ODBC?如果与 ODBC 连接,MS Access 是否支持“CASE WHEN”子句?
【发布时间】:2013-02-01 22:16:39
【问题描述】:

ODBC 是否支持 MS Access 的 CASE WHEN 子句?还有其他不支持CASE WHEN 子句的数据库吗?我在使用 ODBC 连接到 MS Access 时尝试了以下查询,但出现异常。

SELECT (CASE WHEN (AGE > 10) THEN 1 ELSE 0 END) FROM demo

[Microsoft][ODBC Microsoft Access Driver] Syntax error (missing operator) in query expression '(CASE WHEN (AGE > 10) THEN 1 ELSE 0 END)'

我试图找到一种通用方法,该方法适用于大多数数据库,以在连接 ODBC 时使用比较表达式生成(计算)新的“布尔列”。实际上,MS Access 支持在 SELECT 子句中进行比较,但对于其他一些数据库,则需要 CASE 子句。对于 MS Access,SQL 可以是

SELECT AGE > 10 FROM demo

但在其他情况下它必须是

SELECT (CASE WHEN (AGE > 10) THEN 1 ELSE 0 END) FROM demo

【问题讨论】:

  • 我似乎记得您曾在 MS Access 中使用 IIF 而不是 CASE(这不是 ODBC 特有的,只是一般的 Access 事物)。
  • 是的,但 IIF 是特定于 MS Access 的。我想确定 ODBC 是否支持 MS Access 的 CASE
  • 使用 ODBC 发送语句时,您必须使用目标数据库支持的 SQL。 MS Access 不支持 CASE 语句,因此与 MS Access 的 ODBC 连接也无法“支持”它们。
  • @LordPeter 我怀疑 OP 是否会得到更好的答案。 (Harriet Vane 这些天怎么样?)
  • @Remou 我的出身卑微,但他们的故事很迷人:)

标签: sql database ms-access odbc


【解决方案1】:

由于您使用 Access 来编写查询,因此您必须坚持使用 Access 的 SQL 版本。

要在几个不同的返回值之间进行选择,请使用 switch() 函数。所以翻译和扩展你的例子:

select switch(
  age > 40, 4,
  age > 25, 3,
  age > 20, 2,
  age > 10, 1,
  true, 0
) from demo

“真”情况是默认情况。如果您没有它并且其他情况都不匹配,则该函数将返回 null。

Office website 有这方面的文档,但他们的示例语法是 VBA,这也是错误的。我已就此向他们提供反馈,但您应该按照上面的示例进行操作。

【讨论】:

  • Switch() 返回分配给第一个匹配条件的值。因此,如果年龄为 40,则该表达式将返回 1。改为按年龄降序排列条件。但我们甚至不知道 Aaron 是否想要评估多个条件。
  • @HansUp - 感谢您的关注! 拍自己的额头 是的,我们不知道他是否想要多个案例,但我只是想展示语法的一般形式,他可以删除他不需要的额外案例。
  • @Yawar @HansUp 谢谢大家,我正在尝试找到一种通用方法,该方法适用于大多数数据库,以使用比较表达式生成(计算)新的“布尔列”。实际上,MS Access 支持SELECT 子句中的比较,但对于其他一些数据库,则需要CASE 子句。在 MS Access 中,SQL 可以是 SELECT AGE > 10 FROM demo,但在其他情况下,它必须是 SELECT (CASE WHEN (AGE > 10) THEN 1 ELSE 0 END) FROM demo
  • @yawar +1 代表开关。由于您似乎对文档进行了研究,您能否对 switch 和 IIF 之间的性能比较进行一些说明?从我遇到 IIF 慢...
  • @bonCodigo 我对性能特征了解不多根据我的经验,switch() 不擅长处理与null 的比较。所以如果你正在做类似switch(something is null, 1, ...) 的事情,你应该改用iif(something is null, 1, ...)
【解决方案2】:

您可以使用IIF 语句,如下例所示:

SELECT
   IIF(test_expression, value_if_true, value_if_false) AS FIELD_NAME
FROM
   TABLE_NAME

【讨论】:

    【解决方案3】:

    我不得不使用多个 IIF 语句在 ACCESS SQL 中创建类似的结果。

    IIf([refi type] Like "FHA ST*","F",IIf([refi type]="VA IRRL","V"))
    

    所有剩余的都将保持为 Null。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-03-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-14
      • 1970-01-01
      • 2014-10-15
      相关资源
      最近更新 更多