【问题标题】:Can the comparison operators be used in select clause for column computing in SQL?SQL中列计算的select子句中可以使用比较运算符吗?
【发布时间】: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应该是什么样子?

【问题讨论】:

    标签: sql odbc


    【解决方案1】:

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

    MSSQLOracle 上,您应该使用

    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
    猜你喜欢
    • 2011-01-20
    • 2019-11-06
    • 1970-01-01
    • 2023-03-30
    • 1970-01-01
    • 2011-02-14
    • 2021-04-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多