Aracılığıyla paylaş


SQL veri türü kuralları

Şunlar için geçerlidir: onay işareti evet olarak işaretlenmiş Databricks SQL onay işareti evet olarak işaretlenmiş Databricks Runtime

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 da yapabilirsiniz:

  • cast işlevi çoğu tür arasında yayınlar ve döndüremezse hatalar döndürür.
  • try_cast işlevi atama işlevi gibi çalışır ancak geçersiz değerler geçirildiğinde NULL döndürür.
  • Sağlanan biçim yönergelerini kullanarak türler arasında geçiş yapılan diğer yerleşik işlevler .

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ür aile türünde 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 arasında -128 127bir aralığı vardır. Tüm olası değerleri güvenli bir şekilde olarak INTEGERyükseltilebilir.

Tür önceliği 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)
TINYINT TINYINT -> SMALLINT -> INT -> BIGINT -> DECIMAL -> FLOAT (1) -> DOUBLE
SMALLINT SMALLINT -> INT -> BIGINT -> DECIMAL -> FLOAT (1) -> DOUBLE
INT INT -> BIGINT -> ONDALıK -> FLOAT (1) -> DOUBLE
BIGINT BIGINT -> ONDALıK -> FLOAT (1) -> DOUBLE
ON -DA -LIK ONDALıK -> KAYAN (1) -> ÇIFT
YÜZMEK FLOAT (1) -> ÇIFT
ÇİFT ÇİFT
DATE TARİh -> ZAMAN DAMGASI
TIMESTAMP TIMESTAMP
DİZİ DIZI (2)
İKİLİ İKİLİ
BOOLEAN BOOLEAN
ARA ARA
HARİTA MAP (2)
DİZGİ DİZGİ
YAPI YAPı (2)
VARYANT VARIANT
NESNE NESNE (3)

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

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

(3) OBJECT yalnızca içinde VARIANTbulunur.

Dizeler ve NULL

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

  • NULL başka bir türe yükseltilebilir.
  • STRING, , BINARY, BOOLEAN, DATE, DOUBLEve INTERVALTIMESTAMPolarak yükseltilebilirBIGINT. Gerçek dize değeri en az ortak türe atanamıyorsa Azure Databricks bir çalışma zamanı hatası oluşturur. Dize değerine yükseltme INTERVAL işlemi aralık birimleriyle eşleşmelidir.

Tür önceliği grafiği

Bu, öncelik hiyerarşisinin tür öncelik listesi ile dizeleri ve DLL kurallarını birleştiren grafiksel 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ür parametresini 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, in, en küçük veya en büyük gibi birden çok parametre için paylaşılan 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 ortak tür olarak çözümlenirse FLOATözel kurallar uygulanır. Katkıda bulunan türlerden herhangi biri tam bir sayısal tür (TINYINT, SMALLINT, INTEGER, BIGINTveya DECIMAL) ise, olası basamak kaybını önlemek için en az yaygın tür gönderiliyordur DOUBLE .

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

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

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

    Örtük downcasting, daha geniş bir türü otomatik olarak daha dar bir türe yayınlar ve atamayı açıkça belirtmenize gerek kalmadan. Alta aktarma kullanışlıdır, ancak gerçek değerin dar türde temsil edilememesi durumunda beklenmeyen çalışma zamanı hataları riskini taşır.

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

  • Örtük çapraz yayın

    Örtük çapraz yayın, atamayı açıkça belirtmenize gerek kalmadan bir tür ailesinden diğerine bir değer yayınlar.

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

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

İşlev çağırmada atama

Çözümlenen 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:

Örnekler

coalesce işlevi, en az ortak bir 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 kullanılan 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ğı noktaya yayın nedeniyle veya TIMESTAMP BIGINT 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