处理可空值的函数
isNull
返回参数是否为 NULL。
另请参阅运算符 IS NULL。
语法
isNull(x)
别名:ISNULL。
参数
x— 非复合数据类型的值。
返回值
- 如果
x为NULL,则返回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— 列。
返回值
示例
查询
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。 - 如果
x为NULL,则返回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 键。
返回值
- 当
x和y均为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— 如果x为NULL,函数返回的值。
返回值
- 如果
x不为NULL,则返回x。 - 如果
x为NULL,则返回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,则可以返回任意结果。另请参阅函数 ifNull 和 coalesce。
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) │
└────────────────────────────┘