本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
類型相容性與轉換
下列主題說明類型轉換規則和資料類型相容性的運作方式 AWS Clean Rooms SQL。
相容性
在資料庫各種操作的作業期間,會進行資料類型的比對,以及字面值與常數和資料類型的比對,包括下列的操作:
-
資料表上的資料處理語言 (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 會根據目前的工作階段時區轉換為 DATETIME、 或 TIMESTAMP 。工作階段時區預設為 UTC 。在轉換之後,會去掉時區的資訊。
-
代表指定時區時間戳記的字元字串會使用TIMESTAMPTZ目前工作階段時區轉換為 ,這是預設UTC的。同樣地,代表指定時區時間的字元字串會使用TIMETZ目前工作階段時區轉換為 ,這是預設UTC的。
隱含轉換類型
隱含轉換有兩種:
-
指派中的隱含轉換,例如在 INSERT或 UPDATE命令中設定值
-
表達式中的隱含轉換,例如在 WHERE子句中執行比較
下表列出可在指派或表達式中隱含轉換的資料類型。您也可以使用明確轉換函式來進行這些轉換。
轉換前的類型 | 轉換後的類型 |
---|---|
BIGINT | BOOLEAN |
CHAR | |
DECIMAL (NUMERIC) | |
DOUBLE PRECISION (FLOAT8) | |
INTEGER | |
REAL (FLOAT4) | |
SMALLINT 或 SHORT | |
VARCHAR | |
CHAR | VARCHAR |
DATE | CHAR |
VARCHAR | |
TIMESTAMP | |
TIMESTAMPTZ | |
DECIMAL (NUMERIC) | BIGINT 或 LONG |
CHAR | |
DOUBLE PRECISION (FLOAT8) | |
INTEGER INT) | |
REAL (FLOAT4) | |
SMALLINT 或 SHORT | |
VARCHAR | |
DOUBLE PRECISION (FLOAT8) | BIGINT 或 LONG |
CHAR | |
DECIMAL (NUMERIC) | |
INTEGER (INT) | |
REAL (FLOAT4) | |
SMALLINT 或 SHORT | |
VARCHAR | |
INTEGER (INT) | BIGINT 或 LONG |
BOOLEAN | |
CHAR | |
DECIMAL (NUMERIC) | |
DOUBLE PRECISION (FLOAT8) | |
REAL (FLOAT4) | |
SMALLINT 或 SHORT | |
VARCHAR | |
REAL (FLOAT4) | BIGINT 或 LONG |
CHAR | |
DECIMAL (NUMERIC) | |
INTEGER (INT) | |
SMALLINT 或 SHORT | |
VARCHAR | |
SMALLINT | BIGINT 或 LONG |
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、、TIMETZ、 DATE TIME或 字元字串之間的隱含轉換會使用目前的工作階段時區。
VARBYTE 資料類型無法隱含轉換為任何其他資料類型。如需詳細資訊,請參閱CAST 函數。