SQL 資料類型規則
適用於: Databricks SQL Databricks Runtime
Azure Databricks 使用數個規則來解決數據類型之間的衝突:
您也可以在許多類型之間明確轉換:
- 轉換函 式會在大部分類型之間轉換,如果無法,則會傳回錯誤。
- try_cast函 式的運作方式類似 cast函 式,但在傳遞無效值時會傳回NULL。
- 使用提供的格式指示詞,在型別之間轉換其他 內建 函式。
類型升級
類型升級是將類型轉換成相同類型系列的另一種類型,其中包含原始類型的所有可能值的程式。
因此,類型升級是安全的作業。 例如 TINYINT
,範圍從 -128
到 127
。 所有可能的值都可以安全地升階為 INTEGER
。
類型優先順序清單
類型 優先順序清單 會定義指定數據類型的值是否可以隱含地升階為另一個數據類型。
資料類型 | 優先順序清單 (從最窄到最寬) |
---|---|
TINYINT | TINYINT - SMALLINT ->> INT -> BIGINT -> DECIMAL -> FLOAT (1) -> DOUBLE |
SMALLINT | SMALLINT - INT ->> BIGINT -> DECIMAL -> FLOAT (1) -> DOUBLE |
INT | INT - BIGINT -> 十進制 ->> FLOAT (1) -> DOUBLE |
BIGINT | BIGINT - DECIMAL ->> FLOAT (1) -> DOUBLE |
DECIMAL | DECIMAL -> FLOAT (1) -> DOUBLE |
FLOAT | FLOAT (1) -> DOUBLE |
DOUBLE | DOUBLE |
DATE | DATE -> TIMESTAMP |
TIMESTAMP | timestamp |
陣列 | ARRAY (2) |
二元的 | BINARY |
布爾 | BOOLEAN |
INTERVAL | INTERVAL |
地圖 | 地圖 (2) |
字串 | 字串 |
結構 | 結構 (2) |
變體 | VARIANT |
物件 | 物件 (3) |
(1) 略過最不常見的類型解析FLOAT
,以避免失去精確度。
(2) 對於複雜類型,優先順序規則會以遞歸方式套用至其元件元素。
(3) OBJECT
只存在於 內 VARIANT
。
字串和 NULL
特殊規則適用於 STRING
與不具 NULL
類型的 :
NULL
可以升階為任何其他類型。STRING
可以升階為BIGINT
、、BINARY
、BOOLEAN
DATE
、DOUBLE
、、INTERVAL
和TIMESTAMP
。 如果無法將實際字串值轉換成 最不常見的 Azure Databricks 類型 ,就會引發運行時錯誤。 升階為INTERVAL
字串值時,必須符合間隔單位。
類型優先順序圖表
這是優先順序階層的圖形描述,結合 類型優先順序清單 和 字串和 NUL 規則。
最不常見的類型解析
一組類型中最不常見的類型是類型優先順序圖表中所有專案可觸達的最窄類型。
最不常見的類型解析是用來:
- 決定是否可以使用較窄型別的自變數來叫用預期指定型別參數的函式。
- 衍生函式的自變數類型,該函式預期多個參數的共用自變數類型,例如 聯合、 in、 least 或 greatest。
- 衍生運算子的操作數類型,例如算術運算或比較。
- 衍生案例表達式等表達式的結果類型。
- 衍生數位和對應建構函式的專案、索引鍵或實值型別。
- 衍生 UNION、INTERSECT 或 EXCEPT 集合運算子的結果類型。
如果最不常見的類型解析為 FLOAT
,則會套用特殊規則。 如果任何參與型別是確切的數值類型 (TINYINT
、 、 SMALLINT
BIGINT
INTEGER
或 DECIMAL
) ,則會推送最不常見的類型,DOUBLE
以避免可能遺失數位。
隱含的向下轉型和交叉傳播
Azure Databricks 只會在函式和運算符調用上使用這些形式的隱含轉換,而且只有在可以明確判斷意圖的位置。
隱含向下轉型
隱含向下轉型會自動將較寬的類型轉換成較窄的類型,而不需要明確指定轉換。 向下轉換很方便,但如果實際值無法在窄型別中表示,則會帶來非預期運行時間錯誤的風險。
向下轉換會 以反向順序套用類型優先順序清單 。
隱含交叉傳播
隱含交叉轉換會將某個類型系列的值轉換成另一個類型系列,而不需要明確指定轉換。
Azure Databricks 支援下列來源的隱含交叉傳播:
- 除了以外的任何簡單型
BINARY
別, 到STRING
。 STRING
任何簡單型別的 。
- 除了以外的任何簡單型
在函式調用上轉型
假設有已解析的函式或運算符,下列規則會依照每個參數和自變數組所列的順序套用:
如果支持的參數類型是自變數類型優先順序圖表的一部分,Azure Databricks 會將自變數升階為該參數類型。
在大部分情況下,函式描述會明確指出支援的型別或鏈結,例如「任何數值類型」。
例如, sin(expr) 會運作,
DOUBLE
但會接受任何數值。如果預期的參數類型是 ,
STRING
而且自變數是簡單的 Azure Databricks 類型,會將自變數交叉傳送 至字元串參數類型。例如, substr(str, start, len) 預期
str
為STRING
。 相反地,您可以傳遞數值或日期時間類型。如果自變數類型是
STRING
,且預期的參數類型是簡單的類型,Azure Databricks 會將字串自變數交叉傳送 至最廣支援的參數類型。例如, date_add(date, days) 預期
DATE
和INTEGER
。如果您使用兩
STRING
個 s 叫date_add()
用 ,Azure Databricks 會將第一個STRING
交叉傳送至DATE
,而第二STRING
個INTEGER
會交叉傳送至 。如果函式預期數值類型,例如
INTEGER
、 或DATE
類型,但自變數是較一般類型,例如DOUBLE
或TIMESTAMP
,Azure Databricks 會 隱含地將自變數向下轉型 為該參數類型。例如, date_add(date, days) 預期 和
DATE
INTEGER
。如果您使用
date_add()
和叫用 ,Azure Databricks 會藉由移除時間元件和BIGINT
將 向下轉型DATE
TIMESTAMP
為 。INTEGER
BIGINT
TIMESTAMP
否則,Azure Databricks 會引發錯誤。
範例
只要聯合函式共用最不常見的類型,聯合函式就會接受任何一組自變數類型。
結果類型是自變數的最低通用類型。
-- The least common type of TINYINT and BIGINT is BIGINT
> SELECT typeof(coalesce(1Y, 1L, NULL));
BIGINT
-- INTEGER and DATE do not share a precedence chain or support crosscasting in either direction.
> SELECT typeof(coalesce(1, DATE'2020-01-01'));
Error: Incompatible types [INT, DATE]
-- Both are ARRAYs and the elements have a least common type
> SELECT typeof(coalesce(ARRAY(1Y), ARRAY(1L)))
ARRAY<BIGINT>
-- The least common type of INT and FLOAT is DOUBLE
> SELECT typeof(coalesce(1, 1F))
DOUBLE
> SELECT typeof(coalesce(1L, 1F))
DOUBLE
> SELECT typeof(coalesce(1BD, 1F))
DOUBLE
-- The least common type between an INT and STRING is BIGINT
> SELECT typeof(coalesce(5, '6'));
BIGINT
-- The least common type is a BIGINT, but the value is not BIGINT.
> SELECT coalesce('6.1', 5);
Error: 6.1 is not a BIGINT
-- The least common type between a DECIMAL and a STRING is a DOUBLE
> SELECT typeof(coalesce(1BD, '6'));
DOUBLE
子字串函式會預期字串和INTEGER
開頭和長度參數的類型STRING
自變數。
-- Promotion of TINYINT to INTEGER
> SELECT substring('hello', 1Y, 2);
he
-- No casting
> SELECT substring('hello', 1, 2);
he
-- Casting of a literal string
> SELECT substring('hello', '1', 2);
he
-- Downcasting of a BIGINT to an INT
> SELECT substring('hello', 1L, 2);
he
-- Crosscasting from STRING to INTEGER
> SELECT substring('hello', str, 2)
FROM VALUES(CAST('1' AS STRING)) AS T(str);
he
-- Crosscasting from INTEGER to STRING
> SELECT substring(12345, 2, 2);
23
||(CONCAT) 允許隱含交叉傳送至字串。
-- A numeric is cast to STRING
> SELECT 'This is a numeric: ' || 5.4E10;
This is a numeric: 5.4E10
-- A date is cast to STRING
> SELECT 'This is a date: ' || DATE'2021-11-30';
This is a date: 2021-11-30
date_add可以透過 或來叫用TIMESTAMP
,因為BIGINT
隱含的下播。
> SELECT date_add(TIMESTAMP'2011-11-30 08:30:00', 5L);
2011-12-05
date_add因為隱含的交叉傳播,所以可以使用 來叫用 STRING
。
> SELECT date_add('2011-11-30 08:30:00', '5');
2011-12-05