SQL中列计算的select子句中可以使用比较运算符吗?

Posted

技术标签:

【中文标题】SQL中列计算的select子句中可以使用比较运算符吗?【英文标题】:Can the comparison operators be used in select clause for column computing in SQL? 【发布时间】:2013-02-05 05:41:00 【问题描述】:

比较运算符(>、=、

SELECT column1, column2, column1 >= column2 AS "column3" FROM table

似乎只有一些数据库支持比较运算符,例如 MS Access。我正在使用 ODBC 连接到不同的数据库,我知道的一种方法是改用 "CASE...WHEN...THEN...ELSE" 子句。问题是,是否有另一种方法可以在 select 子句中使用比较运算符来计算新列?

另一个问题是,如果我想使用新的计算列(示例中的“column3”)过滤WHERE子句中的一些数据,SQL应该是什么样子?

【问题讨论】:

【参考方案1】:

您是对的 - 并非所有数据库都支持这种比较语法。但最流行的开源数据库:mysql(SQLFiddle 链接)、PostgreSQL 和SQLite 都支持它。

在MSSQL 和Oracle 上,您应该使用

CASE a>b THEN 1 ELSE 0 END

作为一种解决方法(这也适用于前面提到的所有数据库)。

关于在 WHERE 子句中使用新列的问题:通常,您不能这样做,除非您在内部 SELECT 周围再包裹一个外部 SELECT,并在外部 SELECT 中使用另一个 WHERE。

【讨论】:

CASE 语法是 ANSI SQL,适用于所有 DBMS,应该首选,因为它可以更好地记录意图。 为了在WHERE子句中使用新列,我刚刚在oracle中尝试过,似乎我可以直接复制WHERE中的CASE子句而不用外部SELECT包裹它。这是否意味着我可以对大多数数据库遵循这种方式?这是 SQL,SELECT avg(age) as avg_age, (case when (age>22) then 'true' else 'false' end) as retried FROM qmao_person group by (case when (age>22) then 'true' else 'false' end); 你当然可以在WHERE 中使用整个CASE WHEN ...GROUP BY 中而不用在SELECT 中结束(但你必须重复整个表达式)。但是您不能给它一个名称(别名)作为输入表达式并在WHEREGROUP BY 中使用该别名 是的,重复WHEREGROUP BY中的表达式似乎比使用嵌套SELECT有点愚蠢。问题是哪种方式更有效。 @AaronMao:它将高度依赖于实现。但是,许多供应商会将您的查询优化到无关紧要的程度。通常的做法是将子选择转换为连接,或者将常见的子表达式分解为只计算一次。例如,这基本上是HAVING 子句中的一个要求——你必须重复看似昂贵的表达式,即使它之前被别名。在这些情况下,你最好的朋友是EXPLAIN ANALYZE

以上是关于SQL中列计算的select子句中可以使用比较运算符吗?的主要内容,如果未能解决你的问题,请参考以下文章

使用 SQL 序数位置表示法的好处?

如何在带有 select 语句的 where 子句中使用比较运算符?

SQL WHERE 子句

如何将表中列中的逗号分隔值放入 SQL IN 运算符?

MYSQL-第七章

SQL Select 计算 where 子句