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
中结束(但你必须重复整个表达式)。但是您不能给它一个名称(别名)作为输入表达式并在WHERE
或GROUP BY
中使用该别名
是的,重复WHERE
和GROUP BY
中的表达式似乎比使用嵌套SELECT
有点愚蠢。问题是哪种方式更有效。
@AaronMao:它将高度依赖于实现。但是,许多供应商会将您的查询优化到无关紧要的程度。通常的做法是将子选择转换为连接,或者将常见的子表达式分解为只计算一次。例如,这基本上是HAVING
子句中的一个要求——你必须重复看似昂贵的表达式,即使它之前被别名。在这些情况下,你最好的朋友是EXPLAIN ANALYZE
以上是关于SQL中列计算的select子句中可以使用比较运算符吗?的主要内容,如果未能解决你的问题,请参考以下文章