=====================  比较函数和操作符 ===================== .. container:: sect1 :name: FUNCTIONS-COMPARISON .. container:: titlepage .. container:: .. container:: .. rubric:: 比较函数和操作符 :name: 比较函数和操作符 :class: title 常见的比较操作符都可用,如\ 下表\ 所示。 .. container:: table :name: FUNCTIONS-COMPARISON-OP-TABLE **表 比较操作符** .. container:: table-contents ================ ======== 操作符 描述 ================ ======== ``<`` 小于 ``>`` 大于 ``<=`` 小于等于 ``>=`` 大于等于 ``=`` 等于 ``<>`` or ``!=`` 不等于 ================ ======== .. note:: .. rubric:: 注意 :name: 注意 :class: title ``!=``\ 操作符在分析器阶段被转换成\ ``<>``\ 。不能把\ ``!=``\ 和\ ``<>``\ 操作符实现为做不同的事。 比较操作符可以用于所有可以比较的数据类型。所有比较操作符都是双目操作符,它们返回\ ``boolean``\ 类型;类似于\ ``1 < 2 < 3``\ 的表达式是非法的(因为没有\ ``<``\ 操作符可以比较一个布尔值和\ ``3``\ )。 如\ 下表\ 所示,也有一些比较谓词。它们的行为和操作符很像,但是具有 SQL 标准所要求的特殊语法。 .. container:: table :name: FUNCTIONS-COMPARISON-PRED-TABLE **表 比较谓词** .. container:: table-contents +----------------------------------+----------------------------------+ | 谓词 | 描述 | +==================================+==================================+ | a ``BETWEEN`` x | 在\ x \ 和\ y \ 之间 | | ``AND`` y | | +----------------------------------+----------------------------------+ | a ``NOT BETWEEN`` x | 不在\ x \ 和\ y \ 之间 | | ``AND`` y | | +----------------------------------+----------------------------------+ | a ``BETWEEN SYMMETRIC`` | 在对比较值排序后 | | x ``AND`` y | 位于\ x \ 和\ y \ 之间 | +----------------------------------+----------------------------------+ | a | 在对比较值排序后不 | | ``NOT BETWEEN SYMMETRIC`` | 位于\ x \ 和\ y \ 之间 | | x ``AND`` y | | +----------------------------------+----------------------------------+ | a ``IS DISTINCT FROM`` | 不等于,空值被当做一个普通值 | | b | | +----------------------------------+----------------------------------+ | a ``IS NOT DISTINCT FROM`` | 等于,空值被当做一个普通值 | | b | | +----------------------------------+----------------------------------+ | expression ``IS NULL`` | 是空值 | +----------------------------------+----------------------------------+ | expression ``IS NOT NULL`` | 不是空值 | +----------------------------------+----------------------------------+ | expression ``ISNULL`` | 是空值(非标准语法) | +----------------------------------+----------------------------------+ | expression ``NOTNULL`` | 不是空值(非标准语法) | +----------------------------------+----------------------------------+ | boolean_expression | 为真 | | ``IS TRUE`` | | +----------------------------------+----------------------------------+ | boolean_expression | 为假或未知 | | ``IS NOT TRUE`` | | +----------------------------------+----------------------------------+ | boolean_expression | 为假 | | ``IS FALSE`` | | +----------------------------------+----------------------------------+ | boolean_expression | 为真或者未知 | | ``IS NOT FALSE`` | | +----------------------------------+----------------------------------+ | boolean_expression | 值为未知 | | ``IS UNKNOWN`` | | +----------------------------------+----------------------------------+ | boolean_expression | 为真或者为假 | | ``IS NOT UNKNOWN`` | | +----------------------------------+----------------------------------+ ``BETWEEN``\ 谓词可以简化范围测试: .. code:: synopsis a BETWEEN x AND y 等效于 .. code:: synopsis a >= x AND a <= y 注意\ ``BETWEEN``\ 认为终点值是包含在范围内的。 ``NOT BETWEEN``\ 可以做相反比较: .. code:: synopsis a NOT BETWEEN x AND y 等效于 .. code:: synopsis a < x OR a > y ``BETWEEN SYMMETRIC``\ 和\ ``BETWEEN``\ 相似,不过\ ``BETWEEN SYMMETRIC``\ 不要求\ ``AND``\ 左边的参数小于或等于右边的参数。如果左参数不是小于等于右参数,这两个参数会自动被交换,这样总是会应用一个非空范围。 当有一个输入为空时,普通的比较操作符会得到空(表示“未知”),而不是真或假。例如,\ ``7 = NULL``\ 得到空,\ ``7 <> NULL``\ 也一样。如果这种行为不合适,可以使用\ ``IS [ NOT ] DISTINCT FROM``\ 谓词: .. code:: synopsis a IS DISTINCT FROM b a IS NOT DISTINCT FROM b 对于非空输入,\ ``IS DISTINCT FROM``\ 和\ ``<>``\ 操作符一样。不过,如果两个输入都为空,它会返回假。而如果只有一个输入为空,它会返回真。类似地,\ ``IS NOT DISTINCT FROM``\ 对于非空输入的行为与\ ``=``\ 相同,但是当两个输入都为空时它返回真,并且当只有一个输入为空时返回假。因此,这些谓词实际上把空值当作一种普通数据值而不是“unknown”。 要检查一个值是否为空,使用下面的谓词: .. code:: synopsis expression IS NULL expression IS NOT NULL 或者等效,但并不标准的谓词: .. code:: synopsis expression ISNULL expression NOTNULL *不要*\ 写\ ``expression`` = NULL,因为\ ``NULL``\ 是不“等于”\ ``NULL``\ 的(控制代表一个未知的值,因此我们无法知道两个未知的数值是否相等)。 .. tip:: .. rubric:: 提示 :name: 提示 :class: title 有些应用可能要求表达式\ ``expression`` = NULL在\ *expression*\ 得出空值时返回真。我们强烈建议这样的应用修改成遵循 SQL 标准。但是,如果这样修改不可能完成,那么我们可以使用配置变量\ `transform_null_equals `__\ 。如果打开它,PostgreSQL将把\ ``x = NULL``\ 子句转换成\ ``x IS NULL``\ 。 如果\ *expression*\ 是行值,那么当行表达式本身为非空值或者行的所有域为非空时\ ``IS NULL``\ 为真。由于这种行为,\ ``IS NULL``\ 和\ ``IS NOT NULL``\ 并不总是为行值表达式返回反转的结果,特别是,一个同时包含 NULL 和非空值的域将会对两种测试都返回假。在某些情况下,写成\ *row* ``IS DISTINCT FROM NULL``\ 或者\ *row* ``IS NOT DISTINCT FROM NULL``\ 会更好,它们只会检查整个行值是否为空而不需要在行的域上做额外的测试。 布尔值也可以使用下列谓词进行测试: .. code:: synopsis boolean_expression IS TRUE boolean_expression IS NOT TRUE boolean_expression IS FALSE boolean_expression IS NOT FALSE boolean_expression IS UNKNOWN boolean_expression IS NOT UNKNOWN 这些谓词将总是返回真或假,从来不返回空值,即使操作数是空也如此。空值输入被当做逻辑值“未知”。 请注意实际上\ ``IS UNKNOWN``\ 和\ ``IS NOT UNKNOWN``\ 分别与\ ``IS NULL``\ 和\ ``IS NOT NULL``\ 相同, 只是输入表达式必须是布尔类型。 如\ 下表\ 中所示,也有一些比较相关的函数可用。 .. container:: table :name: FUNCTIONS-COMPARISON-FUNC-TABLE **表 比较函数** .. container:: table-contents +------------------+------------------+------------------+----------+ | 函数 | 描述 | 例子 | 例子结果 | +==================+==================+==================+==========+ | | 返 | ``num_nonnul | ``2`` | | ``num_nonnulls(V | 回非空参数的数量 | ls(1, NULL, 2)`` | | | ARIADIC "any")`` | | | | +------------------+------------------+------------------+----------+ | | 返回空参数的数量 | ``num_nul | ``1`` | | ``num_nulls(V | | ls(1, NULL, 2)`` | | | ARIADIC "any")`` | | | | +------------------+------------------+------------------+----------+