这是本节的多页打印视图。 点击此处打印.

返回本页常规视图.

NULL 处理函数

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 WHENexpression1IS NOT NULL THENexpression2ELSEexpression3 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,而不是返回错误。