ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
# 9.2\. 比较操作符 可用的比较操作符在[Table 9-1](#calibre_link-2189)显示。 **Table 9-1\. 比较操作符** | 操作符 | 描述 | | --- | --- | | `&lt;` | 小于 | | `&gt;` | 大于 | | `&lt;=` | 小于或等于 | | `&gt;=` | 大于或等于 | | `=` | 等于 | | `&lt;&gt;`或`!=` | 不等于 | > **Note:** `!=`操作符在分析器阶段被转换成`&lt;&gt;`。 `!=`和`&lt;&gt;`操作符是完全等价的。 比较操作符可以用于所有相关的数据类型。所有比较操作符都是双目操作符, 返回`boolean`类型数值;像`1 &lt; 2 &lt; 3` 这样的表达式是非法的(因为布尔值和`3`之间不能做比较)。 除了比较操作符以外,我们还可以使用`BETWEEN`构造。 ``` _a_ BETWEEN _x_ AND _y_ ``` 等效于 ``` _a_ >= _x_ AND _a_ <= _y_ ``` 注意`BETWEEN`认为端点值是包含在范围内的。`NOT BETWEEN` 做相反的比较: ``` _a_ NOT BETWEEN _x_ AND _y_ ``` 等效于 ``` _a_ < _x_ OR _a_ > _y_ ``` `BETWEEN SYMMETRIC`和`BETWEEN`一样,只是没有要求 `AND`左边的参数小于或等于右边的参数。如果左面的参数不小于或等于右面的参数, 那么两个参数是自动交换的,所以非空范围总是适用。 要检查一个值是否为 NULL ,使用下面的构造: ``` _expression_ IS NULL _expression_ IS NOT NULL ``` 或者等效,但并不标准的构造: ``` _expression_ ISNULL _expression_ NOTNULL ``` _不要_写`_expression_` = NULL 因为`NULL`是不"等于"`NULL`的。 NULL 代表一个未知的数值,因此我们无法知道两个未知的数值是否相等。这个行为遵循 SQL 标准。 > **Tip:** 有些应用可能要求表达式`_expression_` = NULL 在`_expression_`为 NULL 时候返回真。 我们强烈建议这样的应用修改成遵循 SQL 标准。但是,如果这样修改是不可能的, 那么我们可以打开[transform_null_equals](#calibre_link-1572)配置参数, 让PostgreSQL将`x = NULL` 自动转换成`x IS NULL`。 > **Note:** 如果`_expression_`是行值, 那么当行表达式本身为 NULL 或该行的所有字段都为 NULL 时,`IS NULL`将为真; 当行表达式本身不为 NULL 并且该行的所有字段都不为 NULL 时,`IS NOT NULL` 也将为真。因为这个行为,`IS NULL`和`IS NOT NULL` 并不总是为行值表达式返回相反的值,也就是, 一个同时包含NULL和non-null值的行值表达式将在两种情况下都返回false。 这个规定符合 SQL 标准,但是与PostgreSQL之前的版本不兼容。 如果有任何一个输入是 NULL ,那么普通的比较操作符生成 NULL(表示"未知"), 而不是true或false。例如,`7 = NULL`生成null,`7 &lt;&gt; NULL` 也生成null。当这种行为不适用时,使用`IS [ NOT ] DISTINCT FROM`构造: ``` _expression_ IS DISTINCT FROM _expression_ _expression_ IS NOT DISTINCT FROM _expression_ ``` 对于非 NULL 的输入`IS DISTINCT FROM`与`&lt;&gt;` 操作符相同。但是,如果两个输入都是 NULL ,那么它将返回假;如果只有一个输入是 NULL , 那么它将返回真。类似的,对于非 NULL 的输入`IS NOT DISTINCT FROM` 与`=`操作符相同。但是,如果两个输入都是 NULL ,那么它将返回真; 如果只有一个输入是 NULL ,那么它将返回假。这样就很有效地把 NULL 当作一个普通数据值看待, 而不是"未知"。 布尔数值可以用下面的构造进行测试 ``` _expression_ IS TRUE _expression_ IS NOT TRUE _expression_ IS FALSE _expression_ IS NOT FALSE _expression_ IS UNKNOWN _expression_ IS NOT UNKNOWN ``` 这些构造将总是返回真或假,从来不返回 NULL ,即使操作数是 NULL 也如此。 NULL 输入被当做逻辑数值"未知"。请注意实际上`IS UNKNOWN` 和`IS NOT UNKNOWN`分别与`IS NULL`和`IS NOT NULL` 相同,只是输入表达式必须是布尔类型。