قواعد نوع بيانات SQL

ينطبق على: وضع علامة Databricks SQL وضع علامة Databricks Runtime

يستخدم Azure Databricks العديد من القواعد لحل التعارضات بين أنواع البيانات:

يمكنك أيضا التحويل بشكل صريح بين العديد من الأنواع:

  • يتم تحويل الدالة cast بين معظم الأنواع، وترجع أخطاء إذا لم تتمكن من ذلك.
  • تعمل الدالة 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 -> BIGINT -> DECIMAL -> FLOAT (1) -> DOUBLE
BIGINT BIGINT -> DECIMAL -> FLOAT (1) -> DOUBLE
عشري DECIMAL -> FLOAT (1) -> DOUBLE
طفا FLOAT (1) -> مزدوج
مزدوج مزدوج
تاريخ التاريخ -> الطابع الزمني
الطابع الزمني الطابع الزمني
صفيف صفيف (2)
ثنائي ثنائي
منطقيه BOOLEAN
فترة الفاصل
خريطة MAP (2)
خيط سلسلة
البنيه بنية (2)
متغير متغير
كائن OBJECT (3)

(1) يتم تخطي دقة FLOAT النوع الأقل شيوعا لتجنب فقدان الدقة.

(2) بالنسبة لنوع معقد، تنطبق قاعدة الأسبقية بشكل متكرر على عناصر المكون الخاصة بها.

(3) OBJECT موجود فقط داخل VARIANT.

سلاسل وخالية

تنطبق القواعد الخاصة على STRING و غير المصممة NULL:

  • NULL يمكن ترقيته إلى أي نوع آخر.
  • STRINGيمكن ترقيته إلى BIGINTو BOOLEANBINARYوINTERVALDATEDOUBLE.TIMESTAMP إذا تعذر تحويل قيمة السلسلة الفعلية إلى النوع الأقل شيوعا، فإن Azure Databricks يثير خطأ في وقت التشغيل. عند الترقية إلى INTERVAL قيمة السلسلة يجب أن تتطابق مع وحدات الفواصل الزمنية.

الرسم البياني لأولوية النوع

هذا تصوير رسومي للتسلسل الهرمي للأسبقية، يجمع بين قائمة أسبقية النوع والسلاسل وقواعد NULLs .

تمثيل رسومي لقواعد الأسبقية

دقة النوع الأقل شيوعا

النوع الأقل شيوعا من مجموعة من الأنواع هو أضيق نوع يمكن الوصول إليه من الرسم البياني لأسبقية النوع بواسطة كافة عناصر مجموعة الأنواع.

يتم استخدام دقة النوع الأقل شيوعا من أجل:

  • حدد ما إذا كان يمكن استدعاء دالة تتوقع معلمة من نوع معين باستخدام وسيطة من نوع أضيق.
  • اشتق نوع الوسيطة لدالة تتوقع نوع وسيطة مشتركة لمعلمات متعددة، مثل الاندماج أو في أو على الأقل أو الأكبر.
  • اشتقاق أنواع المعاملات لعوامل التشغيل مثل العمليات الحسابية أو المقارنات.
  • اشتقاق نوع النتيجة لتعبيرات مثل تعبير الحالة.
  • اشتقاق نوع العنصر أو المفتاح أو القيمة لمنشئات الصفيف والخريطة.
  • اشتقاق نوع نتيجة عوامل التشغيل UNION أو INTERSECT أو EXCEPT .

يتم تطبيق القواعد الخاصة إذا تم حل النوع الأقل شيوعا إلى FLOAT. إذا كان أي من الأنواع المساهمة هو نوع رقمي دقيق (TINYINTأو SMALLINTBIGINTINTEGERDECIMAL) يتم دفع DOUBLE النوع الأقل شيوعا لتجنب فقدان الأرقام المحتمل.

النشر الضمني والبث المتقاطع

تستخدم Azure Databricks هذه الأشكال من الصب الضمني فقط على استدعاء الوظيفة والمشغل، وفقط حيث يمكن تحديد الهدف بشكل لا لبس فيه.

  • النشر الضمني

    يؤدي النشر الضمني لأسفل تلقائيا إلى تحويل نوع أوسع إلى نوع أضيق دون مطالبتك بتحديد الإرسال بشكل صريح. يعد النشر لأسفل مناسبا، ولكنه ينطوي على خطر حدوث أخطاء غير متوقعة في وقت التشغيل إذا فشلت القيمة الفعلية في أن تكون قابلة للتمثيل في النوع الضيق.

    يطبق Downcasting قائمة أسبقية النوع بترتيب عكسي.

  • الإرسال المتقاطع الضمني

    يؤدي الإرسال المتقاطع الضمني إلى تحويل قيمة من عائلة من نوع إلى آخر دون مطالبتك بتحديد الإرسال بشكل صريح.

    يدعم Azure Databricks الإرسال المتقاطع الضمني من:

    • أي نوع بسيط، باستثناء BINARY، إلى STRING.
    • إلى STRING أي نوع بسيط.

التحويل على استدعاء الدالة

بالنظر إلى دالة أو عامل تشغيل تم حله، تنطبق القواعد التالية، بالترتيب الذي يتم سردها به، لكل معلمة وزوج وسيطة:

  • إذا كان نوع المعلمة المدعوم جزءا من الرسم البياني لأسبقية نوع الوسيطة، فإن Azure Databricks يعزز الوسيطة إلى نوع المعلمة هذا.

    في معظم الحالات، يذكر وصف الدالة صراحة الأنواع أو السلسلة المدعومة، مثل "أي نوع رقمي".

    على سبيل المثال، تعمل sin(expr) على DOUBLE ولكنها ستقبل أي رقم.

  • إذا كان نوع المعلمة المتوقع هو STRING و الوسيطة هي نوع بسيط يقوم Azure Databricks ببث الوسيطة إلى نوع معلمة السلسلة.

    على سبيل المثال، يتوقع str substr(str, start, len) أن يكون STRING. بدلا من ذلك، يمكنك تمرير نوع رقمي أو نوع التاريخ والوقت.

  • إذا كان نوع الوسيطة STRING هو ونوع المعلمة المتوقع هو نوع بسيط، فإن Azure Databricks يبث وسيطة السلسلة إلى أكبر نوع معلمة مدعوم.

    على سبيل المثال، يتوقع DATE date_add (التاريخ، الأيام) و.INTEGER

    إذا قمت باستدعاء date_add() مع اثنين STRINGs، فإن Azure Databricks يقوم بالبث المتقاطع الأول STRING DATE إلى والثاني STRING إلى INTEGER.

  • إذا كانت الدالة تتوقع نوعا رقميا، مثل INTEGER، أو DATE نوع، ولكن الوسيطة هي نوع أكثر عمومية، مثل DOUBLE أو TIMESTAMP، يقوم Azure Databricks ضمنيا بإيقاف تشغيل الوسيطة لنوع المعلمة هذا.

    على سبيل المثال، يتوقع DATE date_add (التاريخ والأيام) و.INTEGER

    إذا قمت باستدعاء مع و، يقوم Azure Databricks بإيقاف الإرسال TIMESTAMP إلى DATE عن طريق إزالة مكون الوقت و BIGINT إلى INTEGER.BIGINTTIMESTAMP date_add()

  • وإلا، فإن 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

تتوقع دالة السلسلة الفرعية وسيطات من نوع STRING السلسلة ومعلمات INTEGER البدء والطول.

-- 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 مع STRINGs بسبب الإرسال المتقاطع الضمني.

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