SQL - 选择语句之外的 IIF 子句?

Posted

技术标签:

【中文标题】SQL - 选择语句之外的 IIF 子句?【英文标题】:SQL - IIF clause outside of select statement? 【发布时间】:2016-02-23 21:01:12 【问题描述】:

我在 MS Access 2010 中工作,在 SELECT 语句中执行一系列 UNION。在所有这些 UNION 完成后,我需要使用 IIF 语句添加几个新列(即,基于 ch 列的值)。但是,我似乎无法找到正确压缩此语法的方式或位置,以便 IIF 检查最终“联合”表中的整个列。简而言之,在运行以下语法(针对此问题进行了修剪和简化)之后,我想根据现有的列单元格(例如,'成绩')包含一个星号。非常感谢您的帮助和耐心——我刚刚开始熟悉 SQL 的语法原则。

SELECT * FROM(
      SELECT class, teacher, student
      grades2010 AS grades
      WHERE NOT(grades2010 IS NULL OR grades2010="")
      UNION
      SELECT class, teacher, student
      grades2011 AS grades
      WHERE NOT(grades2011 IS NULL OR grades2011="")
      UNION
      SELECT class, teacher, student
          grades2012 AS grades
          WHERE NOT(grades2012 IS NULL OR grades2010="")
)

这是我想要运行的 IIF 类型的示例 - 查看“成绩”是否包含星号并创建指标:

IIF(InStr([grades],"*")>0,"YES","NO") AS asterisk

【问题讨论】:

【参考方案1】:

所以...你在正确的轨道上。它看起来像:

SELECT 
     IIF(InStr([grades],"*")>0,"YES","NO") AS asterisk,
     class,
     teacher,
     student
FROM(
      SELECT class, teacher, student
      grades2010 AS grades
      WHERE NOT(grades2010 IS NULL OR grades2010="")
      UNION
      SELECT class, teacher, student
      grades2011 AS grades
      WHERE NOT(grades2011 IS NULL OR grades2011="")
      UNION
      SELECT class, teacher, student
          grades2012 AS grades
          WHERE NOT(grades2012 IS NULL OR grades2010="")
) as mysubquery

但是... grades 不是您的 UNION 子查询中的列,所以这不起作用。您需要确保将 grade 列添加到子查询中的每个 SELECT 语句中,以便在主 SELECT 中对其进行任何处理。

另外值得一提的是,您的架构并不是最好的。而不是每年都有一个表格,您应该只拥有一个以year 为列的表格。这将使您不必做这些讨厌的,而且通常很慢的联合查询。您可以通过创建一个表并在那里使用该 UNION 查询从每个基于年份的表中执行 INSERT 来快速解决这个问题。

【讨论】:

以上是关于SQL - 选择语句之外的 IIF 子句?的主要内容,如果未能解决你的问题,请参考以下文章

SQL 查询语句 IIF()处理条件判断

SQL 选择除最近日期之外的所有内容

是否可以使用“WHERE”子句来选择 SQL 语句中的所有记录?

Firebird/Lazarus SQL 视图与选择 iif?

如何优化SQL语句

如何在选择语句的“NOT IN”子句中使用逗号分隔的字符串列表作为 pl/sql 存储的函数参数