转换失败

当您通过显式转换调用数据类型转换(转换),但该转换失败时,结果将返回错误或 NULL。当您尝试进行冲突的转换时,如尝试将包含字母的 VARCHAR 表达式转换为整数,通常就会发生转换失败。

当转换失败时,返回的结果取决于数据类型。

启用严格的时间转换

您可以使所有转换失败产生错误,包括针对日期/时间数据类型的转换。这样做将使您能查看某些或所有转换失败的原因。要返回错误而不是 NULL,请将配置参数 EnableStrictTimeCasts 设置为 1:

ALTER SESSION SET EnableStrictTimeCasts=1;

默认情况下,EnableStrictTimeCasts 设置为 0。因此,以下尝试将 VARCHAR 转换为 TIME 数据类型的行为返回 NULL:


==> SELECT current_value from configuration_parameters WHERE parameter_name ilike '%EnableStrictTimeCasts%';
 current_value
---------------
 0
(1 row)

=> CREATE TABLE mytable (a VARCHAR);
CREATE TABLE
=> INSERT INTO mytable VALUES('one');
OUTPUT
--------
1
(1 row)

=> INSERT INTO mytable VALUES('1');
OUTPUT
--------
1
(1 row)

=> COMMIT;
COMMIT
=> SELECT a::time FROM mytable;
 a
---


(2 rows)

如果启用 EnableStrictTimeCasts,则转换失败返回错误:


=> ALTER SESSION SET EnableStrictTimeCasts=1;
ALTER SESSION
=> SELECT a::time FROM mytable;
ERROR 3679:  Invalid input syntax for time: "1"

使所有转换失败返回 NULL

要将某一表达式显式转换为请求的数据类型,请使用以下结构:

SELECT expression::data-type

使用此命令将任何值转换为冲突的数据类型,将返回以下错误:

=> SELECT 'one'::time;
ERROR 3679:  Invalid input syntax for time: "one"

Vertica 也支持使用强制转换运算符 ::!,当希望返回以下结果时很有用:

  • 对于非日期/时间数据类型,返回 NULL 而不是错误

  • 在设置 EnableStrictTimeCasts 后,返回 NULL 而不是错误

使所有转换失败返回 NULL 可使在转换期间成功的表达式显示在结果中。但在转换期间失败的表达式将产生 NULL 值。

以下示例使用强制转换运算符 ::! 查询 mytable。查询返回 NULL,其中列 a 包含字符串 one;返回 1,其中列包含 1。无论如何设置 EnableStrictTimeCasts,查询结果都相同:

=> SELECT current_value FROM configuration_parameters WHERE parameter_name ilike '%EnableStrictTimeCasts%';
 current_value
---------------
 0
(1 row)

=> SELECT a::!int FROM mytable;
a
---

1
(2 rows)

ALTER SESSION SET EnableStrictTimeCasts=1;
ALTER SESSION
=> SELECT a::!int FROM mytable;
 a
---

 1
(2 rows)

您可以使用 ::! 转换数组和集合。转换单独解析每个元素,为无法转换的元素生成 NULL。