aturan jenis data SQL
Berlaku untuk: Databricks SQL Databricks Runtime
Azure Databricks menggunakan beberapa aturan untuk mengatasi konflik di antara jenis data:
- Promosi dengan aman memperluas jenis ke jenis yang lebih luas.
- Downcasting implisit mempersempit jenis. Kebalikan dari promosi.
- Crosscasting implisit mengubah jenis menjadi jenis keluarga dari jenis lain.
Anda juga dapat secara eksplisit melemparkan di antara banyak jenis:
- mentransmisikan fungsi di antara sebagian besar jenis, dan mengembalikan kesalahan jika tidak dapat.
- try_cast berfungsi seperti fungsi transmisi tetapi mengembalikan NULL ketika melewati nilai yang tidak valid.
- Fungsi bawaan lainnya ditransmisikan di antara jenis menggunakan arahan format yang disediakan.
Jenis promosi
Promosi jenis adalah proses casting jenis ke jenis lain dari keluarga jenis yang sama yang berisi semua nilai yang mungkin dari jenis asli.
Oleh karena itu, jenis promosi adalah operasi yang aman. Misalnya, TINYINT
memiliki rentang dari -128
ke 127
. Semua nilai yang mungkin dapat dipromosikan dengan aman ke INTEGER
.
Daftar prioritas jenis
Daftar prioritas jenis menentukan apakah nilai dari jenis data tertentu dapat dipromosikan secara implisit ke jenis data lain.
Jenis Data | Daftar prioritas (dari yang tersempit ke terluas) |
---|---|
TINYINT | TINYINT -> SMALLINT -> INT -> BIGINT -> DECIMAL -> FLOAT (1) -> DOUBLE |
SMALLINT | SMALLINT -> INT -> BIGINT -> DECIMAL -> FLOAT (1) -> DOUBLE |
INT | INT -> BIGINT -> DECIMAL -> FLOAT (1) -> DOUBLE |
BIGINT | BIGINT -> DECIMAL -> FLOAT (1) -> DOUBLE |
DECIMAL | DECIMAL -> FLOAT (1) -> DOUBLE |
FLOAT | FLOAT (1) -> DOUBLE |
DOUBLE | DOUBLE |
TANGGAL | DATE -> TIMESTAMP |
STEMPEL WAKTU | TANDA WAKTU |
ARRAY | ARRAY (2) |
BINER | BINER |
BOOLEAN | BOOLEAN |
INTERVAL | INTERVAL |
PETA | MAP (2) |
STRING | STRING |
STRUKTUR | STRUCT (2) |
VARIAN | VARIAN |
BENDA | OBJEK (3) |
(1) Untuk resolusi FLOAT
tipe yang paling tidak umum dilewati untuk menghindari hilangnya presisi.
(2) Untuk jenis yang kompleks, aturan prioritas berlaku secara rekursif pada elemen komponennya.
(3) OBJECT
hanya ada dalam .VARIANT
String dan NULL
Aturan khusus berlaku untuk STRING
dan tidak berupa jenis NULL
:
NULL
dapat dipromosikan ke jenis lain.STRING
dapat dipromosikan menjadiBIGINT
,BINARY
,BOOLEAN
,DATE
,DOUBLE
,INTERVAL
, danTIMESTAMP
. Jika nilai string aktual tidak dapat dilemparkan ke jenis paling tidak umum Azure Databricks menimbulkan kesalahan runtime. Saat mempromosikan ke nilai stringINTERVAL
harus sesuai dengan unit interval.
Grafik prioritas jenis
Ini adalah penggambaran grafis dari hierarki prioritas, menggabungkan daftar prioritas jenis dan string dan aturan NULL.
Resolusi jenis yang paling tidak umum
Jenis yang paling tidak umum dari satu set jenis adalah jenis tersempit yang dapat dijangkau dari grafik prioritas jenis oleh semua elemen dari kumpulan jenis.
Resolusi jenis yang paling tidak umum digunakan untuk:
- Menentukan apakah suatu fungsi yang mengharapkan parameter dari suatu jenis dapat dipanggil menggunakan argumen dari jenis yang lebih sempit.
- Menurunkan jenis argumen untuk fungsi yang mengharapkan jenis argumen bersama untuk beberapa parameter, seperti penggabungan, dalam, paling sedikit, atau terbesar.
- Memperoleh jenis operand untuk operator seperti operasi aritmatika atau perbandingan.
- Menurunkan jenis hasil untuk ekspresi seperti ekspresi kasus.
- Menurunkan jenis elemen, kunci, atau nilai untuk konstruktor array dan peta.
- Menurunkan jenis hasil operator UNION, INTERSECT, atau EXCEPT yang diatur.
Aturan khusus diterapkan jika jenis yang paling tidak umum memutuskan untuk FLOAT
. Jika salah satu jenis yang berkontribusi adalah jenis numerik yang tepat (TINYINT
, SMALLINT
, INTEGER
, BIGINT
atau DECIMAL
), jenis yang paling tidak umum didorong ke DOUBLE
untuk menghindari potensi hilangnya digit.
Downcasting dan crosscasting implisit
Azure Databricks menggunakan bentuk transmisi implisit ini hanya pada fungsi dan pemanggilan operator, dan hanya di mana ia dapat secara tidak ambigu menentukan niat.
Downcasting implisit
Downcasting implisit secara otomatis melemparkan jenis yang lebih luas ke jenis yang lebih sempit tanpa mengharuskan Anda menentukan pemeran secara eksplisit. Downcasting nyaman, tetapi membawa risiko kesalahan runtime yang tidak terduga jika nilai aktual gagal diwakili dalam jenis sempit.
Downcasting menerapkan daftar prioritas jenis dalam urutan terbalik.
Crosscasting implisit
Crosscasting implisit mentransmisikan nilai dari satu keluarga jenis ke keluarga jenis lainnya tanpa mengharuskan Anda menentukan pemeran secara eksplisit.
Azure Databricks mendukung silang implisit dari:
- Jenis sederhana apa pun, kecuali
BINARY
, untukSTRING
. STRING
untuk jenis sederhana apa pun.
- Jenis sederhana apa pun, kecuali
Casting pada pemanggilan fungsi
Mengingat fungsi atau operator yang terselesaikan, aturan berikut berlaku, dalam urutan yang tercantum, untuk setiap parameter dan pasangan argumen:
Jika jenis parameter yang didukung adalah bagian dari grafik prioritas jenis argumen, Azure Databricks mempromosikan argumen ke jenis parameter tersebut.
Dalam kebanyakan kasus, deskripsi fungsi secara eksplisit menyatakan jenis atau rantai yang didukung, seperti "jenis numerik apa pun".
Misalnya, sin(expr) beroperasi di
DOUBLE
tetapi akan menerima numerik apa pun.Jika jenis parameter yang diharapkan adalah
STRING
dan argumen adalah jenis sederhana Azure Databricks menyilangkan argumen ke jenis parameter string.Misalnya, substr(str, start, len) mengharapkan
str
menjadiSTRING
. Sebagai gantinya, Anda dapat meneruskan jenis numerik atau tanggalwaktu.Jika jenis argumen adalah dan jenis parameter yang
STRING
diharapkan adalah jenis sederhana, Azure Databricks menyilangkan argumen string ke jenis parameter terluas yang didukung.Misalnya, date_add (tanggal, hari) mengharapkan
DATE
danINTEGER
.Jika Anda memanggil
date_add()
dengan duaSTRING
s, Azure Databricks menayangkan silang yang pertamaSTRING
keDATE
dan yang kedua ke .INTEGER
STRING
Jika fungsi mengharapkan jenis numerik, seperti
INTEGER
, atauDATE
jenis, tetapi argumen adalah jenis yang lebih umum, sepertiDOUBLE
atauTIMESTAMP
, Azure Databricks secara implisit menurunkan argumen ke jenis parameter tersebut.Misalnya, date_add (tanggal, hari) mengharapkan
DATE
danINTEGER
.Jika Anda memanggil dengan dan , Azure Databricks memperkecil
TIMESTAMP
keDATE
dengan menghapus komponen waktu danBIGINT
keINTEGER
.BIGINT
TIMESTAMP
date_add()
Jika tidak, Azure Databricks menimbulkan kesalahan.
Contoh
Fungsi coalesce menerima sekumpulan jenis argumen selama mereka berbagi jenis yang paling tidak umum.
Jenis hasil adalah jenis yang paling tidak umum dari jenis argumen.
-- 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
Fungsi substring mengharapkan argumen jenis STRING
untuk string dan INTEGER
untuk parameter awal dan panjang.
-- 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) memungkinkan crosscasting implisit ke string.
-- 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 dapat dipanggil dengan TIMESTAMP
atau BIGINT
karena downcasting implisit.
> SELECT date_add(TIMESTAMP'2011-11-30 08:30:00', 5L);
2011-12-05
date_add dapat dipanggil dengan STRING
karena crosscasting implisit.
> SELECT date_add('2011-11-30 08:30:00', '5');
2011-12-05