跳到主要内容
跳到主要内容

处理可空值的函数

isNull

返回参数是否为 NULL

另请参阅运算符 IS NULL

语法

isNull(x)

别名:ISNULL

参数

  • x — 非复合数据类型的值。

返回值

  • 如果 xNULL,则返回 1
  • 如果 x 不为 NULL,则返回 0

示例

┌─x─┬────y─┐
│ 1 │ ᴺᵁᴸᴸ │
│ 2 │ 3 │
└───┴──────┘

查询

SELECT x FROM t_null WHERE isNull(y);

结果

┌─x─┐
│ 1 │
└───┘

isNullable

如果列是可空的(即允许 NULL 值),则返回 1,否则返回 0

语法

isNullable(x)

参数

  • x — 列。

返回值

  • 如果 x 允许 NULL 值,则返回 1UInt8
  • 如果 x 不允许 NULL 值,则返回 0UInt8

示例

查询

CREATE TABLE tab (ordinary_col UInt32, nullable_col Nullable(UInt32)) ENGINE = Log;
INSERT INTO tab (ordinary_col, nullable_col) VALUES (1,1), (2, 2), (3,3);
SELECT isNullable(ordinary_col), isNullable(nullable_col) FROM tab;

结果

   ┌───isNullable(ordinary_col)──┬───isNullable(nullable_col)──┐
1. │ 0 │ 1 │
2. │ 0 │ 1 │
3. │ 0 │ 1 │
└─────────────────────────────┴─────────────────────────────┘

isNotNull

返回参数是否不为 NULL

另请参阅运算符 IS NOT NULL

isNotNull(x)

参数

  • x — 非复合数据类型的值。

返回值

  • 如果 x 不为 NULL,则返回 1
  • 如果 xNULL,则返回 0

示例

┌─x─┬────y─┐
│ 1 │ ᴺᵁᴸᴸ │
│ 2 │ 3 │
└───┴──────┘

查询

SELECT x FROM t_null WHERE isNotNull(y);

结果

┌─x─┐
│ 2 │
└───┘

isNotDistinctFrom

执行 NULL 安全比较。用于比较 JOIN ON 部分中包含 NULL 值的 JOIN 键。此函数将认为两个 NULL 值是相同的,并将返回 true,这与比较两个 NULL 值将返回 NULL 的通常的相等行为不同。

注意

此函数是 JOIN ON 实现使用的内部函数。请不要在查询中手动使用它。

语法

isNotDistinctFrom(x, y)

参数

  • x — 第一个 JOIN 键。
  • y — 第二个 JOIN 键。

返回值

  • xy 均为 NULL 时,返回 true
  • 否则返回 false

示例

完整示例请参见:JOIN 键中的 NULL 值

isZeroOrNull

返回参数是否为 0(零)或 NULL

isZeroOrNull(x)

参数

  • x — 非复合数据类型的值。

返回值

  • 如果 x 为 0(零)或 NULL,则返回 1
  • 否则返回 0

示例

┌─x─┬────y─┐
│ 1 │ ᴺᵁᴸᴸ │
│ 2 │ 0 │
│ 3 │ 3 │
└───┴──────┘

查询

SELECT x FROM t_null WHERE isZeroOrNull(y);

结果

┌─x─┐
│ 1 │
│ 2 │
└───┘

coalesce

返回最左边的非 NULL 参数。

coalesce(x,...)

参数

  • 任意数量的非复合类型参数。所有参数必须是相互兼容的数据类型。

返回值

  • 第一个非 NULL 参数
  • 如果所有参数均为 NULL,则返回 NULL

示例

考虑一个联系人列表,其中可能指定多种联系客户的方式。

┌─name─────┬─mail─┬─phone─────┬──telegram─┐
│ client 1 │ ᴺᵁᴸᴸ │ 123-45-67 │ 123 │
│ client 2 │ ᴺᵁᴸᴸ │ ᴺᵁᴸᴸ │ ᴺᵁᴸᴸ │
└──────────┴──────┴───────────┴───────────┘

mail 和 phone 字段的类型为 String,但 telegram 字段的类型为 UInt32,因此需要将其转换为 String。

从联系人列表中获取客户的第一个可用联系方式

SELECT name, coalesce(mail, phone, CAST(telegram,'Nullable(String)')) FROM aBook;
┌─name─────┬─coalesce(mail, phone, CAST(telegram, 'Nullable(String)'))─┐
│ client 1 │ 123-45-67 │
│ client 2 │ ᴺᵁᴸᴸ │
└──────────┴───────────────────────────────────────────────────────────┘

ifNull

如果参数为 NULL,则返回替代值。

ifNull(x, alt)

参数

  • x — 要检查是否为 NULL 的值。
  • alt — 如果 xNULL,函数返回的值。

返回值

  • 如果 x 不为 NULL,则返回 x
  • 如果 xNULL,则返回 alt

示例

查询

SELECT ifNull('a', 'b');

结果

┌─ifNull('a', 'b')─┐
│ a │
└──────────────────┘

查询

SELECT ifNull(NULL, 'b');

结果

┌─ifNull(NULL, 'b')─┐
│ b │
└───────────────────┘

nullIf

如果两个参数相等,则返回 NULL

nullIf(x, y)

参数

x, y — 要比较的值。必须是兼容的类型。

返回值

  • 如果参数相等,则返回 NULL
  • 如果参数不相等,则返回 x

示例

查询

SELECT nullIf(1, 1);

结果

┌─nullIf(1, 1)─┐
│ ᴺᵁᴸᴸ │
└──────────────┘

查询

SELECT nullIf(1, 2);

结果

┌─nullIf(1, 2)─┐
│ 1 │
└──────────────┘

assumeNotNull

可空类型的值返回对应的非可空值。如果原始值为 NULL,则可以返回任意结果。另请参阅函数 ifNullcoalesce

assumeNotNull(x)

参数

  • x — 原始值。

返回值

  • 如果输入值不为 NULL,则返回作为非可空类型的输入值。
  • 如果输入值为 NULL,则返回任意值。

示例


┌─x─┬────y─┐
│ 1 │ ᴺᵁᴸᴸ │
│ 2 │ 3 │
└───┴──────┘

查询

SELECT assumeNotNull(y) FROM table;

结果

┌─assumeNotNull(y)─┐
│ 0 │
│ 3 │
└──────────────────┘

查询

SELECT toTypeName(assumeNotNull(y)) FROM t_null;

结果

┌─toTypeName(assumeNotNull(y))─┐
│ Int8 │
│ Int8 │
└──────────────────────────────┘

toNullable

将参数类型转换为可空类型。

toNullable(x)

参数

  • x — 非复合类型的值。

返回值

  • 输入值,但类型为可空类型。

示例

查询

SELECT toTypeName(10);

结果

┌─toTypeName(10)─┐
│ UInt8 │
└────────────────┘

查询

SELECT toTypeName(toNullable(10));

结果

┌─toTypeName(toNullable(10))─┐
│ Nullable(UInt8) │
└────────────────────────────┘