SQL veri türü kuralları

Şunun için geçerlidir:evet olarak işaretlendi Databricks SQL denetimi yes Databricks Runtime olarak işaretlendi

Azure Databricks, veri türleri arasındaki çakışmaları çözmek için çeşitli kurallar kullanır:

Ayrıca birçok tür arasında açıkça atama yapabilirsiniz:

Tür yükseltme

Tür yükseltme, bir türü, özgün türün tüm olası değerlerini içeren aynı türde başka bir türe dönüştürme işlemidir. Bu nedenle tür yükseltme güvenli bir işlemdir. Örneğin TINYINT , ile -128127arasında bir aralığı vardır. Tüm olası değerleri güvenli bir şekilde olarak INTEGERyükseltilebilir.

Tür öncelik listesi

Tür öncelik listesi, belirli bir veri türünün değerlerinin örtük olarak başka bir veri türüne yükseltilip yükseltilemeyeceğini tanımlar.

Veri türü Öncelik listesi (en dardan en genişe)
TİNYİNT TINYINT -> SMALLINT -> INT -> BIGINT - DECIMAL ->> FLOAT (1) -> DOUBLE
SMALLİNT SMALLINT -> INT -> BIGINT -> DECIMAL -> FLOAT (1) -> DOUBLE
INT INT -> BIGINT -> DECIMAL -> FLOAT (1) -> DOUBLE
BİGİNT BIGINT -> ONDALıK -> FLOAT (1) -> DOUBLE
ON -DA -LIK ONDALıK -> FLOAT (1) -> DOUBLE
FLOAT FLOAT (1) -> DOUBLE
ÇİFT ÇİFT
TARİH TARIH -> ZAMAN DAMGASı
ZAMAN DAMGASI ZAMAN DAMGASI
DİZİ DIZI (2)
IKİLİ IKİLİ
BOOLEAN BOOLEAN
ARALIĞI ARALIĞI
HARİTA MAP (2)
DİZE DİZE
YAPI YAPı (2)

(1) Duyarlık kaybını önlemek için en az yaygın tür çözünürlüğü float atlanır.

(2) Karmaşık bir tür için öncelik kuralı, bileşen öğelerine özyinelemeli olarak uygulanır.

Dizeler ve NULL

özel kurallar için STRING geçerlidir ve yazılmamış NULL:

  • NULL başka bir türe yükseltilebilir.
  • STRING, , , , DOUBLEBOOLEANDATEINTERVAL, ve TIMESTAMPolarak yükseltilebilir.BIGINTBINARY Gerçek dize değeri en az ortak türe atanamıyorsa Azure Databricks çalışma zamanı hatası verir. Dize değerine yükseltme INTERVAL yaparken aralık birimleriyle eşleşmesi gerekir.

Tür önceliği grafiği

Bu, öncelik hiyerarşisinin tür öncelik listesini , dizeleri ve NULL'leri kurallarını birleştiren grafik bir gösterimidir.

Öncelik kurallarının grafik gösterimi

En az ortak tür çözümlemesi

Bir tür kümesindeki en az yaygın tür, tür kümesinin tüm öğeleri tarafından tür önceliği grafiğinden ulaşılabilen en dar türdür.

Aşağıdakiler için en az yaygın tür çözümlemesi kullanılır:

  • Belirli bir türe sahip bir parametre bekleyen bir işlevin daha dar bir tür bağımsız değişkeni kullanılarak çağrılıp çağrılamayacağına karar verin.
  • Birleşim, içinde, en az veya en büyükgibi birden çok parametre için paylaşılan bir bağımsız değişken türü bekleyen bir işlev için bağımsız değişken türünü türetin.
  • Aritmetik işlemler veya karşılaştırmalar gibi işleçler için işlenen türlerini türetin.
  • Büyük/küçük harf ifadesi gibi ifadeler için sonuç türünü türetin.
  • Dizi ve eşleme oluşturucuları için öğe, anahtar veya değer türlerini türetin.
  • UNION, INTERSECT veya EXCEPT küme işleçlerinin sonuç türünü türetin.

En az yaygın tür olarak çözümlenirse FLOATözel kurallar uygulanır. Katkıda bulunan türlerden herhangi biri tam bir sayısal tür (TINYINT, , INTEGER, BIGINTveya DECIMAL) ise, SMALLINTolası basamak kaybını önlemek için en az yaygın tür gönderilirDOUBLE.

Örtük aşağı yayın ve çapraz yayın

Azure Databricks bu örtük atama biçimlerini yalnızca işlev ve işleç çağrısında ve yalnızca amacı kesin olarak belirleyebildiği durumlarda devreye alır.

  • Örtük aşağı noktaya yayın

    Örtük aşağı noktaya yayın, atamayı açıkça belirtmenize gerek kalmadan otomatik olarak daha geniş bir türü daha dar bir türe yayınlar. Aşağı yayın kullanışlı olsa da, gerçek değer dar türde temsil edilemiyorsa beklenmeyen çalışma zamanı hataları riski taşır.

    Aşağı yayın, tür öncelik listesini ters sırada uygular.

  • Örtük çapraz yayın

    Örtük çapraz yayın, bir tür ailedeki bir değeri, atamayı açıkça belirtmenize gerek kalmadan başka bir türe dönüştürür.

    Azure Databricks, aşağıdakilerden örtük çapraz yayınları destekler:

    • için dışında BINARYSTRINGherhangi bir basit tür.
    • A'ya STRING herhangi bir basit türe.

İşlev çağırmada atama

Çözümlenmiş bir işlev veya işleç verildiğinde, her parametre ve bağımsız değişken çifti için aşağıdaki kurallar listelendikleri sırayla uygulanır:

  • Desteklenen bir parametre türü bağımsız değişkenin tür öncelik grafiğinin bir parçasıysa, Azure Databricks bağımsız değişkeni bu parametre türüne yükselter .

    Çoğu durumda işlev açıklaması, desteklenen türleri veya zinciri açıkça (örneğin, "herhangi bir sayısal tür") belirtir.

    Örneğin, sin(expr) üzerinde DOUBLE çalışır ancak herhangi bir sayısal değeri kabul eder.

  • Beklenen parametre türü bir STRING ise ve bağımsız değişken basit bir türse Azure Databricks bağımsız değişkenini dize parametre türüne çapraz yayınlar .

    Örneğin, alt dize (str, start, len) bir STRINGolmasını beklerstr. Bunun yerine, sayısal veya tarih saat türünü geçirebilirsiniz.

  • Bağımsız değişken türü a STRING ise ve beklenen parametre türü basit bir türse, Azure Databricks dize bağımsız değişkenini desteklenen en geniş parametre türüne çapraz yayınlar .

    Örneğin , date_add(tarih, gün) bir DATE ve INTEGERbekler.

    İki s ile çağırırsanızdate_add(), Azure Databricks ilkini STRING ve DATE ikincisini STRING bir INTEGERöğesine çapraz yayınlar.STRING

  • İşlev, bir veya bir tür gibi INTEGERDATE sayısal bir tür bekliyorsa, ancak bağımsız değişken veya TIMESTAMPgibi daha genel bir DOUBLE türse, Azure Databricks bağımsız değişkeni bu parametre türüne örtük olarak aşağı yayınlar.

    Örneğin, bir date_add(tarih, gün) ve DATEINTEGERdeğerini bekler.

    ve TIMESTAMPBIGINTile çağırırsanız date_add() Azure Databricks, zaman bileşenini ve BIGINT öğesini bir INTEGERöğesine kaldırarak öğesini aşağı yayınlarTIMESTAMPDATE.

  • Aksi takdirde Azure Databricks bir hata oluşturur.

Örnekler

Coalesce işlevi, en az ortak türü paylaştıkları sürece herhangi bir bağımsız değişken türü kümesini kabul eder.

Sonuç türü, bağımsız değişkenlerin en az ortak türüdür.

-- 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

Alt dize işlevi, dize için ve başlangıç ve INTEGER uzunluk parametreleri için türünde STRING bağımsız değişkenler bekler.

-- 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

|| (ARALIKBİRLEŞTRİ) dizeye örtük çapraz yayına izin verir.

-- 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 örtük aşağı yayın nedeniyle veya TIMESTAMPBIGINT ile çağrılabilir.

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

date_add örtük çapraz yayın nedeniyle s ile STRINGçağrılabilir.

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