الانتقال إلى المحتوى الرئيسي
الوحدة 6 · الدرس 4 من 424/57 في الدورة~10 min
دروس الوحدة (4/4)

CAST واكتب التحويلات

لغة SQL مكتوبة بقوة: كل عمود له نوع (INTEGER، TEXT، NUMERIC، DATE، TIMESTAMP...)، والعديد من العمليات تتطلب الأنواع ل تطابق. عندما لا يفعلون ذلك — أو عندما تريد تنسيق قيمة بشكل مختلف - يمكنك استخدام طاقم.

بناء الجملتين المتكافئتين

SQL
-- SQL standard:
CAST(123 AS TEXT)

-- PostgreSQL shorthand (più comune nella pratica):
123::text

الشكلين متطابقان. الاختصار ::type أكثر إحكاما و سلاسل بشكل جيد مع تعبيرات أخرى:

SQL
SELECT ordered_at::date AS day,
       (oi.quantity * oi.unit_price)::numeric(10,2) AS total,
       id::text || ' - ' || email AS label
FROM   …;

قوالب مفيدة على مجموعة البيانات

SQL
TIMESTAMP → DATE          ordered_at::date
NUMERIC   → INTEGER       price::int           -- tronca!
INTEGER   → NUMERIC       quantity::numeric    -- per evitare div. intera
INTEGER   → TEXT          id::text             -- per concatenare con ||
TEXT      → DATE          '2024-03-05'::date
NUMERIC   → TEXT          price::text          -- per LIKE su numeri

عندما يمكن أن تفشل المدلى بها

SQL
SELECT 'abc'::int;   -- ERRORE: invalid input syntax for type integer
SELECT '12.5'::int;  -- ERRORE: invalid input syntax for type integer
SELECT 12.5::int;    -- 12   (cast numerico-numerico: arrotonda)

تعد عمليات الإرسال من سلسلة → رقم أو سلسلة → تاريخ هي الأكثر خطورة: أنها تثير خطأ إذا كانت السلسلة لا تتطابق تمامًا مع المتوقع تنسيق. في الإنتاج، على البيانات الخارجية، من الأفضل التحقق من صحتها أولاً مع TRIM / LOWER / regex.

يلقي والنظام حسب

حالة تولد أخطاء خفية: فرز الأرقام المخزنة كنص.

SQL
SELECT '2', '10', '1' ORDER BY 1;  -- '1', '10', '2'   (alfabetico!)

الحل: الإرسال بالداخل ORDER BY:

SQL
SELECT code FROM articles ORDER BY code::int;

جربه

تمرين#sql.m6.l4.e1
المحاولات: 0جارٍ التحميل…

لكل طلب، قم بإظهار المعرف واليوم (فقط جزء التاريخ من order_at، من نوع التاريخ). عمودين. الطلب حسب المعرف.

جارٍ تحميل المحرر…
إظهار التلميح

يقوم TIMESTAMP → DATE بإسقاط الوقت: order_at::date.

الحل متاح بعد 3 من المحاولات

تمرين المراجعة

تمرين#sql.m6.l4.e2
المحاولات: 0جارٍ التحميل…

بالنسبة لكل عميل، اعرض عمود التصنيف الذي يربط المعرف والبريد الإلكتروني مفصولين بـ " - " (على سبيل المثال، "1 - alice.rossi@example.com"). الطلب حسب المعرف.

جارٍ تحميل المحرر…
إظهار التلميح

|| يتطلب عامل التشغيل معاملات من نفس النوع: يعد إرسال المعرف إلى النص هو الطريقة الأنظف.

الحل متاح بعد 3 من المحاولات