跳转到主内容
跳转到主内容

比较函数

比较规则

下面的比较函数返回类型为 UInt801。只有同一组内的值可以进行比较(例如 UInt16UInt64),不同组之间的值不能相互比较(例如 UInt16DateTime)。 可以比较数字和字符串,也可以比较字符串与日期、日期与时间。 对于元组和数组,比较是按字典序进行的,这意味着会依次比较左侧和右侧元组/数组中对应位置的元素。

可以进行比较的类型包括:

  • 数值和小数
  • 字符串和定长字符串
  • 日期
  • 日期时间
  • 元组(按字典序比较)
  • 数组(按字典序比较)
注意

字符串按字节逐个比较。如果某个字符串包含 UTF-8 编码的多字节字符,这可能会导致意外结果。 如果字符串 S1 以字符串 S2 为前缀,则认为 S1 比 S2 长。

equals

在 v1.1 中引入

比较两个值是否相等。

语法

equals(a, b)
        -- a = b
        -- a == b

参数

  • a — 第一个参数值。* - b — 第二个参数值。*

返回值

返回 UInt8 类型的值:如果 a 等于 b 则返回 1,否则返回 0

示例

使用示例

SELECT 1 = 1, 1 = 2;
┌─equals(1, 1)─┬─equals(1, 2)─┐
│            1 │            0 │
└──────────────┴──────────────┘

globalIn

自 v1.1 起引入

in 相同,但在分布式查询中使用全局 Set 分发机制。该 Set 会被发送到所有远程服务器。

语法

globalIn(x, set)

参数

  • x — 要检查的值。 - set — 一组值的 Set。

返回值

如果 x 在 set 中则返回 1,否则返回 0。UInt8

示例

基本用法

SELECT 1 IN (1, 2, 3)
1

globalInIgnoreSet

引入版本:v1.1

in 相同,但在分布式查询中使用全局 Set 分发。该 Set 会被发送到所有远程服务器。 这是 IgnoreSet 的变体,用于在不创建 Set 的情况下进行类型分析。

语法

globalIn(x, set)

参数

  • x — 要检查的值。- set — 值的 Set。

返回值

如果 x 在 Set 中则返回 1,否则返回 0。 UInt8

示例

基本用法

SELECT 1 IN (1, 2, 3)
1

globalNotIn

引入版本:v1.1

notIn 相同,但在分布式查询中使用全局 Set 分发机制。该 Set 会被发送到所有远程服务器。

语法

globalNotIn(x, set)

参数

  • x — 要检查的值。
  • set — Set 类型的值集合。

返回值

如果 x 不在该 Set 中,则返回 1,否则返回 0。UInt8

示例

基本用法

SELECT 4 NOT IN (1, 2, 3)
1

globalNotInIgnoreSet

引入版本:v1.1

notIn 相同,但在分布式查询中对 Set 使用全局分发机制。Set 会被发送到所有远程服务器。 这是用于类型分析且无需创建 Set 的 IgnoreSet 变体。

语法

globalNotIn(x, set)

参数

  • x — 要检查的值。 - set — 值的集合。

返回值

如果 x 不在该集合中,返回 1,否则返回 0。UInt8

示例

基本用法

SELECT 4 NOT IN (1, 2, 3)
1

globalNotNullIn

引入版本:v1.1

notNullIn 相同,但在分布式查询中使用全局 Set 进行分发。该 Set 会被发送到所有远程服务器。

语法

globalNotNullIn(x, set)

参数

  • x — 要检查的值。- set — 值的集合。

返回值

如果 x 不在该集合中,则返回 1,否则返回 0。UInt8

示例

基本用法

SELECT notNullIn(NULL, tuple(1, NULL))
0

globalNotNullInIgnoreSet

引入版本:v1.1

notNullIn 相同,但在分布式查询中使用全局 Set 进行分发。该 Set 会被发送到所有远程服务器。 这是 IgnoreSet 的变体,用于在不创建 Set 的情况下进行类型分析。

语法

globalNotNullIn(x, set)

参数

  • x — 要检查的值。 - set — 值的 Set。

返回值

若 x 不在 Set 中,则返回 1,否则返回 0。UInt8

示例

基本用法

SELECT notNullIn(NULL, tuple(1, NULL))
0

globalNullIn

引入版本:v1.1

nullIn 相同,但在分布式查询中使用全局 Set 分发。该 Set 会被发送到所有远程服务器。

语法

globalNullIn(x, set)

参数

  • x — 要检查的值。 - set — 值的 Set。

返回值

如果 x 在 Set 中,则返回 1,否则返回 0。UInt8

示例

基本用法

SELECT nullIn(NULL, tuple(1, NULL))
1

globalNullInIgnoreSet

引入于:v1.1

nullIn 相同,但在分布式查询中采用全局 Set 分发策略。该 Set 会被发送到所有远程服务器。 这是用于类型分析且无需实际创建 Set 的 IgnoreSet 变体。

语法

globalNullIn(x, set)

参数

  • x — 要检查的值。- set — 值的 Set。

返回值

如果 x 在 Set 中则返回 1,否则返回 0。UInt8

示例

基本用法

SELECT nullIn(NULL, tuple(1, NULL))
1

greater

自 v1.1 起引入

用于比较两个值是否满足大于关系。

语法

greater(a, b)
    -- a > b

参数

  • a — 第一个值。*
  • b — 第二个值。*

返回值

如果 a 大于 b,则返回 1,否则返回 0,类型为 UInt8

示例

用法示例

SELECT 2 > 1, 1 > 2;
┌─greater(2, 1)─┬─greater(1, 2)─┐
│             1 │             0 │
└───────────────┴───────────────┘

greaterOrEquals

引入版本:v1.1

用于比较两个值是否具有大于或等于的关系。

语法

greaterOrEquals(a, b)
    -- a >= b

参数

  • a — 第一个值。* - b — 第二个值。*

返回值

如果 a 大于或等于 b,则返回 1,否则返回 0,返回类型为 UInt8

示例

使用示例

SELECT 2 >= 1, 2 >= 2, 1 >= 2;
┌─greaterOrEquals(2, 1)─┬─greaterOrEquals(2, 2)─┬─greaterOrEquals(1, 2)─┐
│                     1 │                     1 │                     0 │
└───────────────────────┴───────────────────────┴───────────────────────┘

in

引入版本:v1.1

检查左操作数是否属于右操作数的 Set。若属于则返回 1,否则返回 0。左操作数中的 NULL 值会被忽略(视为不在该 Set 中)。

语法

in(x, set)

参数

  • x — 要检查的值。 - set — 值的 Set 集合。

返回值

如果 x 在集合中则返回 1,否则返回 0。 UInt8

示例

基本用法

SELECT 1 IN (1, 2, 3)
1

inIgnoreSet

引入于:v1.1

检查左操作数是否是右操作数 Set 的成员。如果是,则返回 1,否则返回 0。左操作数中的 NULL 值会被跳过(视为不在该 Set 中)。 这是用于类型分析且无需创建 Set 的 IgnoreSet 变体。

语法

in(x, set)

参数

  • x — 要检查的值。 - set — 值的 Set(值的集合)。

返回值

如果 x 在该集合中则返回 1,否则返回 0。 UInt8

示例

基本用法

SELECT 1 IN (1, 2, 3)
1

isDistinctFrom

引入版本:v25.11

对两个值执行 NULL 安全的“不等于”比较。 如果两个值彼此不同(不相等),则返回 true,包括当一个值为 NULL 而另一个不为 NULL 的情况。 如果两个值相等,或两者均为 NULL,则返回 false

语法

isDistinctFrom(x, y)

参数

  • x — 要比较的第一个值。可以是任意 ClickHouse 数据类型。Any
  • y — 要比较的第二个值。可以是任意 ClickHouse 数据类型。Any

返回值

如果两个值不相同,则返回 true,并将 NULL 当作可比较的值处理:

  • 如果 x != y,则返回 true
    • 如果 x 或 y 中恰有一个为 NULL,则返回 true
    • 如果 x = y,或者 x 和 y 都为 NULL,则返回 falseBool

示例

包含数字和 NULL 的基本用法

SELECT
    isDistinctFrom(1, 2) AS result_1,
    isDistinctFrom(1, 1) AS result_2,
    isDistinctFrom(NULL, 1) AS result_3,
    isDistinctFrom(NULL, NULL) AS result_4
┌─result_1─┬─result_2─┬─result_3─┬─result_4─┐
│        1 │        0 │        1 │        0 │
└──────────┴──────────┴──────────┴──────────┘

isNotDistinctFrom

引入于:v25.10

对两个值执行空值安全的“相等”比较。 如果两个值相等,则返回 true,包括两者都为 NULL 的情况。 如果两个值不同,或者仅有一个为 NULL,则返回 false

语法

isNotDistinctFrom(x, y)

参数

  • x — 要比较的第一个值。可以是任意 ClickHouse 数据类型。Any
  • y — 要比较的第二个值。可以是任意 ClickHouse 数据类型。Any

返回值

在将 NULL 视为可比较值的情况下,如果两个值相等,则返回 true

  • 如果 x = y,则返回 true
    • 如果 x 和 y 都为 NULL,则返回 true
    • 如果 x != y,或者 x 和 y 中恰好有一个为 NULL,则返回 falseBool

示例

针对数字和 NULL 的基本用法

SELECT
    isNotDistinctFrom(1, 1) AS result_1,
    isNotDistinctFrom(1, 2) AS result_2,
    isNotDistinctFrom(NULL, NULL) AS result_3,
    isNotDistinctFrom(NULL, 1) AS result_4
┌─result_1─┬─result_2─┬─result_3─┬─result_4─┐
│        1 │        0 │        1 │        0 │
└──────────┴──────────┴──────────┴──────────┘

less

在 v1.1 中引入

比较两个值是否满足“小于”关系。

语法

less(a, b)
    -- a < b

参数

  • a — 第一个值。* - b — 第二个值。*

返回值

如果 a 小于 b,则返回 1,否则返回 0,类型为 UInt8

示例

使用示例

SELECT 1 < 2, 2 < 1;
┌─less(1, 2)─┬─less(2, 1)─┐
│          1 │          0 │
└────────────┴────────────┘

lessOrEquals

自 v1.1 引入

判断两个值之间是否满足小于等于关系。

语法

lessOrEquals(a, b)
-- a <= b

参数

  • a — 第一个值。* - b — 第二个值。*

返回值

如果 a 小于或等于 b,则返回 1,否则返回 0,类型为 UInt8

示例

使用示例

SELECT 1 <= 2, 2 <= 2, 3 <= 2;
┌─lessOrEquals(1, 2)─┬─lessOrEquals(2, 2)─┬─lessOrEquals(3, 2)─┐
│                  1 │                  1 │                  0 │
└────────────────────┴────────────────────┴────────────────────┘

notEquals

自 v1.1 起引入

用于比较两个值是否不相等。

语法

notEquals(a, b)
    -- a != b
    -- a <> b

参数

  • a — 第一个值。* - b — 第二个值。*

返回值

如果 a 不等于 b,返回 1,否则返回 0UInt8

示例

用法示例

SELECT 1 != 2, 1 != 1;
┌─notEquals(1, 2)─┬─notEquals(1, 1)─┐
│               1 │               0 │
└─────────────────┴─────────────────┘

notIn

引入版本:v1.1

检查左侧操作数是否 是右侧操作数 Set 的成员。如果不在该 Set 中则返回 1,否则返回 0。左侧操作数中的 NULL 值会被忽略。

语法

notIn(x, set)

参数

  • x — 要检查的值。 - set — 值的 Set 集合。

返回值

如果 x 不在 Set 中,则返回 1,否则返回 0。UInt8

示例

基础用法

SELECT 4 NOT IN (1, 2, 3)
1

notInIgnoreSet

引入版本:v1.1

检查左操作数是否 是右操作数 Set 的成员。如果不在该 Set 中则返回 1,否则返回 0。左操作数中的 NULL 值会被跳过。 这是 IgnoreSet 的一种变体,用于在不创建 Set 的情况下进行类型分析。

语法

notIn(x, set)

参数

  • x — 要检查的值。 - set — 值的集合。

返回值

如果 x 不在该集合中,则返回 1,否则返回 0。UInt8

示例

基本用法

SELECT 4 NOT IN (1, 2, 3)
1

notNullIn

引入版本:v1.1

检查左操作数是否 不是 右操作数 Set 的成员。与 notIn 不同,NULL 值不会被忽略:NULL 会与 Set 中的元素进行比较,且 NULL = NULL 的结果为 true。

语法

notNullIn(x, set)

参数

  • x — 要检查的值。
  • set — 值的 Set 集合。

返回值

如果 x 不在 Set 中,则返回 1;否则返回 0。UInt8

示例

基本用法

SELECT notNullIn(NULL, tuple(1, NULL))
0

notNullInIgnoreSet

引入于:v1.1

检查左操作数是否 是右操作数集合的成员。与 notIn 不同,NULL 值不会被忽略:会将 NULL 与集合元素进行比较,且 NULL = NULL 的结果为 true。 这是 IgnoreSet 的变体,用于在不创建 Set 的情况下进行类型分析。

语法

notNullIn(x, set)

参数

  • x — 要检查的值。
  • set — 值的 Set。

返回值

如果 x 不在 set 中则返回 1,否则返回 0。UInt8

示例

基本用法

SELECT notNullIn(NULL, tuple(1, NULL))
0

nullIn

自 v1.1 版本引入

检查左操作数是否是右操作数 Set 的成员。与 in 不同,NULL 值不会被跳过:会将 NULL 与 Set 中的元素进行比较,并且 NULL = NULL 的结果为 true。

语法

nullIn(x, set)

参数

  • x — 要检查的值。 - set — 值的 Set。

返回值

如果 x 在 Set 中则返回 1,否则返回 0。 UInt8

示例

基本用法

SELECT nullIn(NULL, tuple(1, NULL))
1

nullInIgnoreSet

引入版本:v1.1

检查左操作数是否是右操作数集合的成员。与 in 不同,NULL 值不会被跳过:NULL 会与集合元素进行比较,并且 NULL = NULL 的结果为 true。 这是 IgnoreSet 的一个变体,用于在不创建集合的情况下进行类型分析。

语法

nullIn(x, set)

参数

  • x — 要检查的值。 - set — 值的集合。

返回值

如果 x 在集合中,则返回 1;否则返回 0。UInt8

示例

基本用法

SELECT nullIn(NULL, tuple(1, NULL))
1