NULL 处理函数可接受任何类型的自变量,返回类型基于其自变量类型。
1 - COALESCE
返回列表中第一个非空表达式的值。如果所有表达式的求值均为 NULL,则 COALESCE
返回 NULL。
COALESCE
符合 ANSI SQL-92 标准。
行为类型
不可变语法
COALESCE ( { * | expression[,...] } )
参数
-
* | expression[,...]
- 以下几项之一:
-
*
(星号)对查询表中的所有列进行求值。
-
表达式
任何数据类型的表达式。expression 中包含的函数必须具有确定性。
-
示例
COALESCE 返回从表 lead_vocalists
查询的每一行中的第一个非空值。请注意,在第一行中,COALESCE 返回空字符串。
=> SELECT quote_nullable(fname)fname, quote_nullable(lname)lname,
quote_nullable(coalesce (fname, lname)) "1st non-null value" FROM lead_vocalists ORDER BY fname;
fname | lname | 1st non-null value
---------+-----------+--------------------
'' | 'Sting' | ''
'Diana' | 'Ross' | 'Diana'
'Grace' | 'Slick' | 'Grace'
'Mick' | 'Jagger' | 'Mick'
'Steve' | 'Winwood' | 'Steve'
NULL | 'Cher' | 'Cher'
(6 rows)
另请参阅
2 - IFNULL
返回列表中第一个非空表达式的值。
IFNULL 为 NVL 的别名。
行为类型
不可变语法
IFNULL ( expression1 , expression2 );
参数
-
如果 expression1 为 NULL,则 IFNULL 返回 expression2。
-
如果 expression1 不为 NULL,则 IFNULL 返回 expression1。
注意
-
COALESCE 为更标准、更通用的函数。
-
IFNULL 等同于 ISNULL。
-
IFNULL 等同于 COALESCE,但 IFNULL 仅通过两个实参调用。
-
ISNULL(a,b)
与x IS NULL
不同。 -
实参可以包含 Vertica 支持的所有数据类型。
-
实施等同于 CASE 表达式。例如:
CASE WHEN expression1 IS NULL THEN expression2 ELSE expression1 END;
-
以下语句返回值 140:
SELECT IFNULL(NULL, 140) FROM employee_dimension;
-
以下语句返回值 60:
SELECT IFNULL(60, 90) FROM employee_dimension;
示例
=> SELECT IFNULL (SCORE, 0.0) FROM TESTING;
IFNULL
--------
100.0
87.0
.0
.0
.0
(5 rows)
另请参阅
3 - ISNULL
返回列表中第一个非空表达式的值。
ISNULL 为 NVL 的别名。
行为类型
不可变语法
ISNULL ( expression1 , expression2 );
参数
-
如果 expression1 为 NULL,则 ISNULL 返回 expression2。
-
如果 expression1 不为 NULL,则 ISNULL 返回 expression1。
注意
-
COALESCE 为更标准、更通用的函数。
-
ISNULL 等同于 COALESCE,但 ISNULL 仅通过两个实参调用。
-
ISNULL(a,b)
与x IS NULL
不同。 -
实参可以包含 Vertica 支持的所有数据类型。
-
实施等同于 CASE 表达式。例如:
CASE WHEN expression1 IS NULL THEN expression2 ELSE expression1 END;
-
以下语句返回值 140:
SELECT ISNULL(NULL, 140) FROM employee_dimension;
-
以下语句返回值 60:
SELECT ISNULL(60, 90) FROM employee_dimension;
示例
SELECT product_description, product_price,
ISNULL(product_cost, 0.0) AS cost
FROM product_dimension;
product_description | product_price | cost
--------------------------------+---------------+------
Brand #59957 wheat bread | 405 | 207
Brand #59052 blueberry muffins | 211 | 140
Brand #59004 english muffins | 399 | 240
Brand #53222 wheat bread | 323 | 94
Brand #52951 croissants | 367 | 121
Brand #50658 croissants | 100 | 94
Brand #49398 white bread | 318 | 25
Brand #46099 wheat bread | 242 | 3
Brand #45283 wheat bread | 111 | 105
Brand #43503 jelly donuts | 259 | 19
(10 rows)
另请参阅
4 - NULLIF
比较两个表达式。如果两个表达式不相等,则该函数返回第一个表达式 (expression1)。如果两个表达式相等,则该函数返回 null。
行为类型
不可变语法
NULLIF( expression1, expression2 )
参数
expression1
- 是任何数据类型的值。
expression2
- 必须与 expr1 具有相同的数据类型,或者其类型必须可以隐式转换为与 expression1 相匹配。结果与 expression1 具有相同的类型。
示例
下面的一系列语句说明了 NULLIF 函数的一个简单用法。
创建包含单列的表 t and insert some values
:
CREATE TABLE t (x TIMESTAMPTZ);
INSERT INTO t VALUES('2009-09-04 09:14:00-04');
INSERT INTO t VALUES('2010-09-04 09:14:00-04');
发出 select 语句:
SELECT x, NULLIF(x, '2009-09-04 09:14:00 EDT') FROM t;
x | nullif
------------------------+------------------------
2009-09-04 09:14:00-04 |
2010-09-04 09:14:00-04 | 2010-09-04 09:14:00-04
SELECT NULLIF(1, 2);
NULLIF
--------
1
(1 row)
SELECT NULLIF(1, 1);
NULLIF
--------
(1 row)
SELECT NULLIF(20.45, 50.80);
NULLIF
--------
20.45
(1 row)
5 - NULLIFZERO
如果列中的值为 0,则计算结果为 NULL。
语法
NULLIFZERO(expression)
参数
expression
- (INTEGER、DOUBLE PRECISION、INTERVAL 或 NUMERIC)是 0 值求值的字符串。
示例
下表 TESTING 显示了 5 名学生的测试得分。请注意,缺少 S. Robinson 和 K. Johnson 的测试得分(NULL 值显示在“分数 (Score)”列中。)
=> SELECT * FROM TESTING;
Name | Score
-------------+-------
J. Doe | 100
R. Smith | 87
L. White | 0
S. Robinson |
K. Johnson |
(5 rows)
下面的 SELECT 语句指定 Vertica 应将“分数 (Score)”列中的任何 0 值返回为 Null。在结果中,您可以看到 Vertica 将 L. White 的 0 分返回为 Null。
=> SELECT Name, NULLIFZERO(Score) FROM TESTING;
Name | NULLIFZERO
-------------+------------
J. Doe | 100
R. Smith | 87
L. White |
S. Robinson |
K. Johnson |
(5 rows)
6 - NVL
返回列表中第一个非空表达式的值。
行为类型
不可变语法
NVL ( expression1 , expression2 );
参数
-
如果 expression1 为 NULL,则 NVL 返回 expression2。
-
如果 expression1 不为 NULL,则 NVL 返回 expression1。
注意
-
COALESCE 为更标准、更通用的函数。
-
NVL 等同于 COALESCE,但 NVL 仅通过两个实参调用。
-
实参可以包含 Vertica 支持的所有数据类型。
-
实施等同于 CASE 表达式:
CASE WHEN expression1 IS NULL THEN expression2 ELSE expression1 END;
示例
expression1 不为 NULL,因此 NVL 返回 expression1:
SELECT NVL('fast', 'database');
nvl
------
fast
(1 row)
expression1 为 NULL,因此 NVL 返回 expression2:
SELECT NVL(null, 'database');
nvl
----------
database
(1 row)
expression2 为 NULL,因此 NVL 返回 expression1:
SELECT NVL('fast', null);
nvl
------
fast
(1 row)
在以下示例中,expression1 (title) 包含 NULL,因此 NVL 返回 expression2 并将 "Withheld" 替换为未知值:
SELECT customer_name, NVL(title, 'Withheld') as title
FROM customer_dimension
ORDER BY title;
customer_name | title
------------------------+-------
Alexander I. Lang | Dr.
Steve S. Harris | Dr.
Daniel R. King | Dr.
Luigi I. Sanchez | Dr.
Duncan U. Carcetti | Dr.
Meghan K. Li | Dr.
Laura B. Perkins | Dr.
Samantha V. Robinson | Dr.
Joseph P. Wilson | Mr.
Kevin R. Miller | Mr.
Lauren D. Nguyen | Mrs.
Emily E. Goldberg | Mrs.
Darlene K. Harris | Ms.
Meghan J. Farmer | Ms.
Bettercare | Withheld
Ameristar | Withheld
Initech | Withheld
(17 rows)
另请参阅
7 - NVL2
接受三个实参。如果第一个实参不为 NULL,则返回第二个实参,否则返回第三个实参。如果第二个实参与第三个实参的数据类型不一致,则隐式转换为通用类型,类似于 COALESCE。
行为类型
不可变语法
NVL2 ( expression1 , expression2 , expression3 );
参数
-
如果 expression1 不为 NULL,则 NVL2 返回 expression2。
-
如果 expression1 为 NULL,则 NVL2 返回 expression3。
注意
实参 2 和 3 可为 Vertica 支持的任何数据类型。
实施等同于 CASE 表达式:
CASE WHEN
expression1IS NOT NULL THEN
expression2ELSE
expression3 END;
示例
在此示例中,expression1 不为 NULL,因此 NVL2 返回 expression2:
SELECT NVL2('very', 'fast', 'database');
nvl2
------
fast
(1 row)
在此示例中,expression1 为 NULL,因此 NVL2 返回 expression3:
SELECT NVL2(null, 'fast', 'database');
nvl2
----------
database
(1 row)
在以下示例中,expression1 (title) 包含 NULL,因此 NVL2 返回 expression3 ("Withheld"),同时将非空值替换为表达式 "Known":
SELECT customer_name, NVL2(title, 'Known', 'Withheld')
as title
FROM customer_dimension
ORDER BY title;
customer_name | title
------------------------+-------
Alexander I. Lang | Known
Steve S. Harris | Known
Daniel R. King | Known
Luigi I. Sanchez | Known
Duncan U. Carcetti | Known
Meghan K. Li | Known
Laura B. Perkins | Known
Samantha V. Robinson | Known
Joseph P. Wilson | Known
Kevin R. Miller | Known
Lauren D. Nguyen | Known
Emily E. Goldberg | Known
Darlene K. Harris | Known
Meghan J. Farmer | Known
Bettercare | Withheld
Ameristar | Withheld
Initech | Withheld
(17 rows)
另请参阅
8 - ZEROIFNULL
如果列为 NULL,则计算为 0。
语法
ZEROIFNULL(expression)
参数
- 表达式
- 用于 NULL 值求值的字符串,以下数据类型之一:
-
INTEGER
-
DOUBLE PRECISION
-
INTERVAL
-
NUMERIC
-
示例
以下查询从表 test_results
返回 5 名学生的得分,其中 L. White 的 Score
设置为 0,S. Robinson 和 K. Johnson 设置为 NULL:
=> SELECT Name, Score FROM test_results;
Name | Score
-------------+-------
J. Doe | 100
R. Smith | 87
L. White | 0
S. Robinson |
K. Johnson |
(5 rows)
下一项查询对列 Score
调用 ZEROIFNULL,因此 Vertica 为 S. Robinson 和 K. Johnson 返回 0:
=> SELECT Name, ZEROIFNULL (Score) FROM test_results;
Name | ZEROIFNULL
-------------+------------
J. Doe | 100
R. Smith | 87
L. White | 0
S. Robinson | 0
K. Johnson | 0
(5 rows)
您还可以在 PARTITION BY
expressions 中使用 ZEROIFNULL,必须始终解析为非空值。例如:
CREATE TABLE t1 (a int, b int) PARTITION BY (ZEROIFNULL(a));
CREATE TABLE
Vertica 在对表t1
进行分区时调用此函数,通常是在加载操作期间执行。加载期间,函数会检查 PARTITION BY
表达式(在本例中为列 a
)的数据是否存在 NULL 值。如果在给定行中遇到 NULL 值,则将分区键设置为 0,而不是返回错误。