Aturan jenis data SQL

Berlaku untuk:check ditandai ya pemeriksaan Databricks SQL ditandai ya Databricks Runtime

Azure Databricks menggunakan beberapa aturan untuk mengatasi konflik di antara jenis data:

Anda juga dapat secara eksplisit melemparkan di antara banyak jenis:

Ketik promosi

Jenis promosi adalah proses transmisi jenis ke jenis lain dari keluarga jenis yang sama yang berisi semua nilai yang mungkin dari jenis aslinya. Oleh karena itu promosi jenis adalah operasi yang aman. Misalnya TINYINT memiliki rentang dari -128 hingga 127. Semua nilai yang mungkin dapat dipromosikan dengan aman ke INTEGER.

Ketik daftar prioritas

Daftar prioritas jenis menentukan apakah nilai jenis data tertentu dapat dipromosikan secara implisit ke jenis data lain.

Jenis data Daftar prioritas (dari tersempit ke terluas)
TINYINT TINYINT -> SMALLINT -> INT -> BIGINT -> DESIMAL -> FLOAT (1) -> GANDA
SMALLINT SMALLINT -> INT -> BIGINT -> DESIMAL -> FLOAT (1) -> GANDA
INT INT -> BIGINT -> DESIMAL -> FLOAT (1) -> GANDA
BIGINT BIGINT -> DESIMAL -> FLOAT (1) -> GANDA
DESIMAL DESIMAL -> FLOAT (1) -> GANDA
FLOAT FLOAT (1) -> GANDA
DOUBLE DOUBLE
TANGGAL TANGGAL -> TANDA WAKTU
TIMESTAMP TIMESTAMP
ARRAY ARRAY (2)
BINER BINER
BOOLEAN BOOLEAN
INTERVAL INTERVAL
PETA MAP (2)
STRING STRING
STRUKTUR STRUKTUR (2)

(1) Untuk resolusi jenis yang paling tidak umum , FLOAT dilewati untuk menghindari hilangnya presisi.

(2) Untuk jenis kompleks, aturan prioritas berlaku secara rekursif untuk elemen komponennya.

String dan NULL

Aturan khusus berlaku untuk STRING dan tidak ditata NULL:

  • NULL dapat dipromosikan ke jenis lain.
  • STRING dapat dipromosikan ke BIGINT, BINARY, BOOLEAN, DATE, DOUBLE, INTERVAL, dan TIMESTAMP. Jika nilai string aktual tidak dapat dilemparkan ke jenis paling tidak umum Azure Databricks menimbulkan kesalahan runtime. Saat mempromosikan ke INTERVAL nilai string harus cocok dengan unit interval.

Grafik prioritas jenis

Ini adalah penggambaran grafis dari hierarki prioritas, menggabungkan daftar prioritas jenis dan string dan aturan NULL .

Representasi grafis aturan prioritas

Resolusi jenis paling tidak umum

Jenis yang paling tidak umum dari sekumpulan jenis adalah jenis tersempit yang dapat dijangkau dari grafik prioritas jenis oleh semua elemen set jenis.

Resolusi jenis yang paling tidak umum digunakan untuk:

  • Tentukan apakah fungsi yang mengharapkan parameter dari jenis tertentu dapat dipanggil menggunakan argumen dari jenis yang lebih sempit.
  • Mendapatkan jenis argumen untuk fungsi yang mengharapkan jenis argumen bersama untuk beberapa parameter, seperti coalesce, in, least, atau greatest.
  • Mendapatkan jenis operand untuk operator seperti operasi aritmatika atau perbandingan.
  • Mendapatkan jenis hasil untuk ekspresi seperti ekspresi kasus.
  • Mendapatkan elemen, kunci, atau jenis nilai untuk array dan konstruktor peta .
  • Memperoleh jenis hasil operator set UNION, INTERSECT, atau EXCEPT .

Aturan khusus diterapkan jika jenis yang paling tidak umum diselesaikan ke FLOAT. Jika salah satu jenis yang berkontribusi adalah jenis numerik yang tepat (TINYINT, , SMALLINT, INTEGERBIGINT, atau DECIMAL) jenis yang paling tidak umum didorong untuk DOUBLE 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.

  • Penurunan implisit

    Penurunan implisit secara otomatis melemparkan jenis yang lebih luas ke jenis yang lebih sempit tanpa mengharuskan Anda menentukan transmisi 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 melemparkan nilai dari satu jenis keluarga ke keluarga lainnya tanpa mengharuskan Anda menentukan transmisi secara eksplisit.

    Azure Databricks mendukung crosscasting implisit dari:

    • Jenis sederhana apa pun, kecuali BINARY, ke STRING.
    • A STRING untuk semua jenis sederhana.

Pemanggilan pada pemanggilan fungsi

Mengingat fungsi atau operator yang diselesaikan, aturan berikut berlaku, dalam urutan yang tercantum, untuk setiap pasangan parameter dan 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 pada 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 menjadi STRING. Sebagai gantinya, Anda dapat meneruskan jenis numerik atau tanggalwaktu.

  • Jika jenis argumen adalah STRING dan jenis parameter yang diharapkan adalah jenis sederhana, Azure Databricks menyilangkan argumen string ke jenis parameter terluas yang didukung.

    Misalnya, date_add(tanggal, hari) mengharapkan DATE dan INTEGER.

    Jika Anda memanggil date_add() dengan dua STRINGs, Azure Databricks melakukan crosscast yang pertama STRING ke DATE dan yang kedua STRING ke INTEGER.

  • Jika fungsi mengharapkan jenis numerik, seperti INTEGER, atau DATE jenis, tetapi argumen adalah jenis yang lebih umum, seperti DOUBLE atau TIMESTAMP, Azure Databricks secara implisit menurunkan argumen ke jenis parameter tersebut.

    Misalnya, date_add(tanggal, hari) mengharapkan DATE dan INTEGER.

    Jika Anda memanggil date_add() dengan dan BIGINT, Azure Databricks menurunkanTIMESTAMPDATE ke dengan TIMESTAMP menghapus komponen waktu dan BIGINT ke INTEGER.

  • 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 argumen yang paling tidak umum.

-- 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 mulai 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 untuk 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 STRINGs karena crosscasting implisit.

> SELECT date_add('2011-11-30 08:30:00', '5');
  2011-12-05