当您通过显式转换调用数据类型转换(转换),但该转换失败时,结果将返回错误或 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
---------------
(1 row)
=> CREATE TABLE mytable (a VARCHAR);
CREATE TABLE
=> INSERT INTO mytable VALUES('one');
OUTPUT
--------
(1 row)
=> INSERT INTO mytable VALUES('1');
OUTPUT
--------
(1 row)
=> COMMIT;
COMMIT
=> SELECT a::time FROM mytable;
(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
---------------
(1 row)
=> SELECT a::!int FROM mytable;
(2 rows)
ALTER SESSION SET EnableStrictTimeCasts=1;
ALTER SESSION
=> SELECT a::!int FROM mytable;
(2 rows)
您可以使用
::!
转换数组和集合。转换单独解析每个元素,为无法转换的元素生成 NULL。