本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
类型兼容性和转换
以下讨论介绍了类型转换规则和数据类型兼容性如何在 AWS Clean Rooms中工作。
兼容性
在各种数据库操作期间,将会出现数据类型匹配以及文本值和常量与数据类型的匹配,包括以下情况:
-
表中的数据操控语言 (DML) 操作
-
UNION、INTERSECT 和 EXCEPT 查询
-
CASE 表达式
-
谓词(如 LIKE 和 IN)的计算
-
执行数据比较或提取的 SQL 函数的计算
-
数学运算符的比较
这些运算的结果取决于类型转换规则和数据类型兼容性。兼容性意味着并非总是需要 one-to-one 匹配特定值和特定数据类型。由于一些数据类型是兼容的,因此可进行隐式转换或强制转换。有关更多信息,请参阅 隐式转换类型。如果数据类型不兼容,您有时可通过使用显式转换函数将值从一种数据类型转换为另一种数据类型。
一般兼容性和转换规则
请注意下列兼容性和转换规则:
-
一般来说,同属一种类型类别的数据类型(如不同的数字数据类型)是兼容的并且可隐式转换。
例如,通过使用隐式转换,您可以将一个小数值插入整数列。小数进位为整数。或者,您可以从日期中提取一个数字值(如
2008
)并将其插入到整数列中。 -
数字数据类型会强制执行尝试插入 out-of-range 值时出现的溢出条件。例如,精度为 5 的小数值无法放入到精度定义为 4 的小数列中。整数或小数的整数部分永远不会被截断。不过,小数的小数部分可以酌情向上或向下舍入。但是,对于显示强制转换表中选定的值而得出的结果,不会进行四舍五入。
-
不同类型的字符字符串是兼容的。包含单字节数据的 VARCHAR 列字符串和 CHAR 列字符串是兼容且可隐式转换的。包含多字节数据的 VARCHAR 字符串是不可兼容的。此外,如果字符串是适当的文本值,则您可以将字符字符串转换为日期、时间、时间戳或数字值。将忽略任何前导空格或尾随空格。反过来,您也可以将日期、时间、时间戳或数字值转换为固定长度或可变长度的字符串。
注意
您要强制转换为数字类型的字符串必须包含数字的字符表示形式。例如,您可将字符串
'1.0'
或'5.9'
强制转换为小数值,但无法将字符串'ABC'
强制转换为任何数字类型。 -
如果将 DECIMAL 值与字符串进行比较,则会 AWS Clean Rooms 尝试将字符串转换为 DECIMAL 值。在将所有其他数值与字符串进行比较时,数值将转换为字符串。如果要强制进行相反的转换(例如,将字符串转换为正数,或者将 DECIMAL 值转换为字符串),请使用显式函数,例如 CAST 函数。
-
若要将 64 位 DECIMAL 或 NUMERIC 值转换为更高的精度,必须使用显式转换函数(如 CAST 或 CONVERT)。
-
将 DATE 或 TIMESTAMP 转换为 TIMESTAMPTZ 时,或者将 TIME 转换为 TIMETZ 时,时区设置为当前会话时区。会话时区默认为 UTC。
-
与之类似,TIMESTAMPTZ 可根据当前会话时区转化为 DATE、TIME 或 TIMESTAMP。会话时区默认为 UTC。转换后,时区信息将被删除。
-
使用当前会话时区(默认为 UTC)将代表有指定时区的时间戳的字符串转换为 TIMESTAMPTZ。使用当前会话时区(默认为 UTC)将代表有指定时区的时间的字符串转换为 TIMETZ。
隐式转换类型
有两种隐式转换类型:
-
赋值中的隐式转化,如 INSERT 或 UPDATE 命令中的设置值。
-
表达式中的隐式转化,例如在 WHERE 子句中执行比较
下表列出了在赋值或表达式中可隐式转换的数据类型。您还可使用显式转换函数执行这些转换。
源类型 | 目标类型 |
---|---|
BIGINT | BOOLEAN |
CHAR | |
DECIMAL (NUMERIC) | |
DOUBLE PRECISION (FLOAT8) | |
INTEGER | |
REAL (FLOAT4) | |
SMALLINT | |
VARCHAR | |
CHAR | VARCHAR |
DATE | CHAR |
VARCHAR | |
TIMESTAMP | |
TIMESTAMPTZ | |
DECIMAL (NUMERIC) | BIGINT |
CHAR | |
DOUBLE PRECISION (FLOAT8) | |
INTEGER (INT) | |
REAL (FLOAT4) | |
SMALLINT | |
VARCHAR | |
DOUBLE PRECISION (FLOAT8) | BIGINT |
CHAR | |
DECIMAL (NUMERIC) | |
INTEGER (INT) | |
REAL (FLOAT4) | |
SMALLINT | |
VARCHAR | |
INTEGER (INT) | BIGINT |
BOOLEAN | |
CHAR | |
DECIMAL (NUMERIC) | |
DOUBLE PRECISION (FLOAT8) | |
REAL (FLOAT4) | |
SMALLINT | |
VARCHAR | |
REAL (FLOAT4) | BIGINT |
CHAR | |
DECIMAL (NUMERIC) | |
INTEGER (INT) | |
SMALLINT | |
VARCHAR | |
SMALLINT | BIGINT |
BOOLEAN | |
CHAR | |
DECIMAL (NUMERIC) | |
DOUBLE PRECISION (FLOAT8) | |
INTEGER (INT) | |
REAL (FLOAT4) | |
VARCHAR | |
TIMESTAMP | CHAR |
DATE | |
VARCHAR | |
TIMESTAMPTZ | |
TIME | |
TIMESTAMPTZ | CHAR |
DATE | |
VARCHAR | |
TIMESTAMP | |
TIMETZ | |
TIME | VARCHAR |
TIMETZ | |
TIMETZ | VARCHAR |
TIME |
注意
在 TIMESTAMPTZ、TIMESTAMP、DATE、TIME、TIMETZ 或字符串之间的隐式转换使用当前会话时区。
无法将 VARBYTE 数据类型隐式转换为任何其它数据类型。有关更多信息,请参阅 CAST 函数。