处理可空值的函数
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
执行空安全比较。用于比较 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) │
└────────────────────────────┘