قواعد نوع البيانات SQL (SQL Databricks)

يستخدم SQL Databricks عدة قواعد لحل التعارضات بين أنواع البيانات. في قلب حل التعارض هذا قائمة الأسبقية النوع الذي يعرف ما إذا كان يمكن ترقية قيم نوع بيانات معين إلى نوع بيانات آخر ضمنيا.

بالإضافة إلى ذلك، عندما استدعاء Databricks SQL دالة فإنه يستخدم أيضا downcasting implicit و الإرسال المتقاطع لمطابقة وسيطات الدالة إلى معلمات الدالة حيثما أمكن.

أولوية النوع

تستخدم SQL Databricks العديد من القواعد التي تحكم كيفية حل التعارضات بين أنواع البيانات. في قلب حل التعارض هذا قائمة الأسبقية النوع الذي يعرف ما إذا كان يمكن ترقية قيم نوع بيانات معين إلى نوع بيانات آخر ضمنيا.

نوع البيانات قائمة الأسبقية (من الأضيق إلى الأوسع)
تينينت TINYINT - > SMALLINT - > INT - > BIGINT - > عشري - > FLOAT - > مزدوج
سمولنت سمولنت - > INT - > BIGINT - > عشري - > FLOAT > - > مزدوج
الباحث INT - > BIGINT - > عشري - > FLOAT > - > مزدوج
بيغنت BIGINT - > عشري - > FLOAT > - > مزدوج
عشري عشري - > FLOAT > - > مزدوج
طفا FLOAT (1) - مزدوج
مزدوج مزدوج
تاريخ التاريخ - > الطابع الزمني
الطابع الزمني الطابع الزمني
صفيف صفيف (2)
ثنائي ثنائي
منطقيه BOOLEAN
الفاصل الفاصل
تعيين MAP (2)
خيط سلسلة
البنيه هيكل (2)

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

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

سلسلة القيم الحرفية و NULL

تنطبق قواعد خاصة على القيم الحرفية للسلسلة و NULL غير المنوعة.

يمكن ترقية NULL إلى أي نوع آخر. يمكن ترقية حرفي سلسلة إلى أي نوع بيانات بسيط.

هذا تصوير رسومي للتسلسل الهرمي الأسبقية:

Graphical representation of precedence rules

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

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

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

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

يتم تطبيق قواعد خاصة إذا حل النوع الأقل شيوعا FLOAT:

إذا كان أي من الأنواع المساهمة هو ، أو يتم INTEGER دفع النوع الأقل شيوعا لتجنب فقدان محتمل BIGINTDECIMALDOUBLE للأرقام.

الشطب الضمني والبث المتبادل

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

  • البث الضمني

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

  • البث المتقاطع الضمني

    تلقي الإرسال المتقاطع الضمني قيمة من عائلة نوع إلى أخرى دون مطالبتك بتحديد التمثيل بشكل صريح. Databricks SQL يدعم الصب الضمني من أي نوع بسيط إلى STRING ، ولكن ليس العكس. ومع ذلك، STRING يمكن تحويل حرفي إلى نوع بسيط آخر، لأن Databricks SQL يمكن اشتقاق أمان cast أثناء تجميع الاستعلام. في حين يمكن تمثيل قيم جميع الأنواع البسيطة ك STRING s ، فمن الواضح أن هذا ليس هو الحال عند صب قيمة إلى أي نوع بسيط STRING آخر.

الصب على استدعاء وظيفة

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

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

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

    على سبيل المثال، يعمل على الخطيئة (expr) ولكن سيقبل أي رقمية.

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

    على سبيل المثال، تتوقع السلسلة الفرعية (str، بدء التشغيل، len) أن تكون STRING . بدلا من ذلك، يمكنك تمرير نوع رقمي أو تاريخ والوقت.

  • إذا كانت الدالة تتوقع نوع رقمي، مثل INTEGER ، أو DATE نوع، ولكن الوسيطة نوع عام أكثر، مثل DOUBLE أو ، TIMESTAMP databricks SQL ضمنيا إلى downcasts الوسيطة إلى ذلك النوع المعلمة.

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

    إذا قمت باستدعاء date_add() مع TIMESTAMP و ، BIGINT databricks SQL downcasts TIMESTAMP إلى عن طريق إزالة مكون الوقت و إلى DATEBIGINTINTEGER .

  • وإلا، يثير databricks SQL خطأ.

أمثلة

تقبل الدالة coalesce (Databricks SQL) أي مجموعة من أنواع الوسيطات طالما أنها تشترك في نوع أقل شيوعا.

نوع النتيجة هو النوع الأقل شيوعا من الوسيطات.

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

تتوقع الدالة السلسلة الفرعية (Databricks SQL) وسيطات من نوع INTEGER السلسلة والمعلمات start and length.

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

-- No crosscasting from STRING to INTEGER
> SELECT substring('hello', str, 2)
  FROM VALUES(CAST('1' AS STRING)) AS T(str);
Error: Argument 2 requires an INT type.

-- Crosscasting from INTEGER to STRING
> SELECT substring(12345, 2, 2);
 23

|| (كونكات) يسمح الإرسال المتقاطع الضمني إلى سلسلة.

-- 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 مع أو BIGINT بسبب downcasting ضمني.

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