表达式

SQL 表达式是将某个值或多个值与其他值进行比较的查询的组件。它们还可以执行计算。在任何 SQL 命令中发现的表达式通常采用条件语句的形式。

运算符优先级

下表按递减(由高到低)顺序显示运算符优先级。

表达式求值规则

未定义子表达式的求值顺序。特别是,不必由左到右或以任何其他固定顺序对运算符或函数输入进行求值。要强制按特定顺序进行求值,请使用 CASE 构造。例如,这是一种在 WHERE 子句中尝试避免除数为零的不受信任方式:

=> SELECT x, y WHERE x <> 0 AND y/x > 1.5;

但这种方式比较安全:

=> SELECT x, y
   WHERE
     CASE
       WHEN x <> 0 THEN y/x > 1.5
       ELSE false
     END;

此方式中使用的 CASE 构造会导致优化尝试失败,因此仅在必要时使用。(在这个特定示例中,最好改为写入 y > 1.5*x 以避免相关问题。)

SQL 表达式的限制

对于您可在表达式中使用的修饰符和递归的数量,存在一些限制。您应该注意以下两项限制:

  • 第一项限制基于可供表达式使用的堆栈。Vertica 需要至少 100kb 的可用堆栈。如果超出此限制,则可能引发错误“查询包含的表达式过于复杂而无法分析 (The query contains an expression that is too complex to analyze)”。额外增加物理内存和/或增大 ulimit -s max 值可增加可用堆栈并防止错误。

  • 第二项限制为分析表达式中可能的递归数。上限为 2000。如果超出此限制,则可能引发错误“查询包含的表达式过于复杂而无法分析 (The query contains an expression that is too complex to analyze)”。此限制无法提高。