表达式
SQL 表达式是将某个值或多个值与其他值进行比较的查询的组件。它们还可以执行计算。在任何 SQL 命令中发现的表达式通常采用条件语句的形式。
运算符优先级
下表按递减(由高到低)顺序显示运算符优先级。
注意
当表达式包含多个运算符时,Vertica 建议您使用括号指定运算顺序,而不是依赖运算符优先级。表达式求值规则
未定义子表达式的求值顺序。特别是,不必由左到右或以任何其他固定顺序对运算符或函数输入进行求值。要强制按特定顺序进行求值,请使用 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)”。此限制无法提高。