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

处理可为NULL值的函数

assumeNotNull

引入于:v1.1

返回 Nullable 类型值对应的非Nullable值。 如果原始值为NULL,则可以返回任意结果。

另请参见:函数 ifNullcoalesce

语法

assumeNotNull(x)

参数

  • x — 任何可为NULL类型的原始值。Nullable(T)

返回值

如果原始值不是NULL,则返回非空值;如果输入值为NULL,则返回任意值。Any

示例

使用示例

CREATE TABLE t_null (x Int8, y Nullable(Int8))
ENGINE=MergeTree()
ORDER BY x;

INSERT INTO t_null VALUES (1, NULL), (2, 3);

SELECT assumeNotNull(y) FROM table;
SELECT toTypeName(assumeNotNull(y)) FROM t_null;
┌─assumeNotNull(y)─┐
│                0 │
│                3 │
└──────────────────┘
┌─toTypeName(assumeNotNull(y))─┐
│ Int8                         │
│ Int8                         │
└──────────────────────────────┘

coalesce

引入于:v1.1

返回最左侧的非NULL参数。

语法

coalesce(x[, y, ...])

参数

  • x[, y, ...] — 任何数量的非复合类型参数。所有参数必须是相互兼容的数据类型。 Any

返回值

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

示例

使用示例

-- Consider a list of contacts that may specify multiple ways to contact a customer.

CREATE TABLE aBook
(
    name String,
    mail Nullable(String),
    phone Nullable(String),
    telegram Nullable(UInt32)
)
ENGINE = MergeTree
ORDER BY tuple();

INSERT INTO aBook VALUES ('client 1', NULL, '123-45-67', 123), ('client 2', NULL, NULL, NULL);

-- The mail and phone fields are of type String, but the telegram field is UInt32 so it needs to be converted to String.

-- Get the first available contact method for the customer from the contact list

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 │ ᴺᵁᴸᴸ                                                      │
└──────────┴───────────────────────────────────────────────────────────┘

firstNonDefault

引入于:v25.9

返回一组参数中的第一个非默认值

语法

参数

  • arg1 — 第一个要检查的参数 - arg2 — 第二个要检查的参数 - ... — 其他要检查的参数

返回值

结果类型为所有参数的超类型

示例

整数

SELECT firstNonDefault(0, 1, 2)
1

字符串

SELECT firstNonDefault('', 'hello', 'world')
'hello'

空值

SELECT firstNonDefault(NULL, 0 :: UInt8, 1 :: UInt8)
1

可为NULL的零

SELECT firstNonDefault(NULL, 0 :: Nullable(UInt8), 1 :: Nullable(UInt8))
0

ifNull

引入于:v1.1

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

语法

ifNull(x, alt)

参数

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

返回值

如果x不为NULL,则返回x的值;否则返回alt Any

示例

使用示例

SELECT ifNull('a', 'b'), ifNull(NULL, 'b');
┌─ifNull('a', 'b')─┬─ifNull(NULL, 'b')─┐
│ a                │ b                 │
└──────────────────┴───────────────────┘

isNotDistinctFrom

引入于:v23.8

执行两个JOIN键之间的空安全比较。该函数会将两个NULL值视为相同,并返回true,这与通常的相等行为不同,通常比较两个NULL值会返回NULL

信息

该函数是JOIN ON实现中使用的内部函数。 请勿在查询中手动使用。

有关完整示例,请参见: JOIN 键中的 NULL

语法

isNotDistinctFrom(x, y)

参数

  • x — 第一个要比较的JOIN键。 Any
  • y — 第二个要比较的JOIN键。 Any

返回值

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

示例

isNotNull

引入于:v1.1

检查参数是否不为NULL

另请参见:运算符 IS NOT NULL

语法

isNotNull(x)

参数

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

返回值

如果x不为NULL,则返回1;否则返回0 UInt8

示例

使用示例

CREATE TABLE t_null
(
  x Int32,
  y Nullable(Int32)
)
ENGINE = MergeTree
ORDER BY tuple();

INSERT INTO t_null VALUES (1, NULL), (2, 3);

SELECT x FROM t_null WHERE isNotNull(y);
┌─x─┐
│ 2 │
└───┘

isNull

引入于:v1.1

检查参数是否为NULL

另请参见:运算符 IS NULL

语法

isNull(x)

参数

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

返回值

如果xNULL,则返回1;否则返回0 UInt8

示例

使用示例

CREATE TABLE t_null
(
  x Int32,
  y Nullable(Int32)
)
ENGINE = MergeTree
ORDER BY tuple();

INSERT INTO t_null VALUES (1, NULL), (2, 3);

SELECT x FROM t_null WHERE isNull(y);
┌─x─┐
│ 1 │
└───┘

isNullable

引入于:v22.7

检查参数的数据类型是否为Nullable(即是否允许NULL值)。

语法

isNullable(x)

参数

  • x — 任何数据类型的值。 Any

返回值

如果x的数据类型为Nullable,则返回1;否则返回0 UInt8

示例

使用示例

CREATE TABLE tab (
    ordinary_col UInt32,
    nullable_col Nullable(UInt32)
)
ENGINE = MergeTree
ORDER BY tuple();
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)──┐
│                           0 │                           1 │
│                           0 │                           1 │
│                           0 │                           1 │
└─────────────────────────────┴─────────────────────────────┘

isZeroOrNull

引入于:v20.3

检查参数是否为零(0)或NULL

语法

isZeroOrNull(x)

参数

返回值

如果xNULL或等于零,则返回1;否则返回0 UInt8/16/32/64Float32/Float64

示例

使用示例

CREATE TABLE t_null
(
  x Int32,
  y Nullable(Int32)
)
ENGINE = MergeTree
ORDER BY tuple();

INSERT INTO t_null VALUES (1, NULL), (2, 0), (3, 3);

SELECT x FROM t_null WHERE isZeroOrNull(y);
┌─x─┐
│ 1 │
│ 2 │
└───┘

nullIf

引入于:v1.1

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

语法

nullIf(x, y)

参数

  • x — 第一个值。 Any
  • y — 第二个值。 Any

返回值

如果两个参数相等,则返回NULL,否则返回第一个参数。 NULLNullable(x)

示例

使用示例

SELECT nullIf(1, 1), nullIf(1, 2);
┌─nullIf(1, 1)─┬─nullIf(1, 2)─┐
│         ᴺᵁᴸᴸ │            1 │
└──────────────┴──────────────┘

toNullable

引入于:v1.1

将提供的参数类型转换为Nullable

语法

toNullable(x)

参数

  • x — 任何非复合类型的值。 Any

返回值

返回输入值但为Nullable类型。 Nullable(Any)

示例

使用示例

SELECT toTypeName(10), toTypeName(toNullable(10));
┌─toTypeName(10)─┬─toTypeName(toNullable(10))─┐
│ UInt8          │ Nullable(UInt8)            │
└────────────────┴────────────────────────────┘