דילוג לתוכן המרכזי
מודול 6 · שיעור 4 מתוך 424/57 בקורס~10 min
שיעורי מודול (4/4)

המרות CAST וסוג

SQL מוקלד חזק: לכל עמודה יש סוג (INTEGER, TEXT, NUMERIC, DATE, TIMESTAMP...), ופעולות רבות דורשות את הסוגים כדי להתאים. כאשר הם לא - או כאשר אתה רוצה לעצב ערך אחרת - אתה משתמש ב-cast.

שני תחבירים שווים

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 / ביטוי רגיל.

שחקנים והזמינו לפי

מקרה שמייצר באגים עדינים: מיון מספרים מאוחסנים כטקסט.

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טוען...

עבור כל הזמנה, הצג מזהה ויום (רק חלק התאריך של ordered_at, של סוג תאריך). שני עמודים. הזמנה לפי תעודת זהות.

טוען עורך...
הצג רמז

ההעברה TIMESTAMP → DATE מוריד את השעה: ordered_at::date.

הפתרון זמין לאחר 3 ניסיונות

סקירת התרגיל

פעילות גופנית#sql.m6.l4.e2
ניסיונות: 0טוען...

עבור כל לקוח הצג עמודת תווית שמשרשרת מזהה ואימייל מופרדים ב-' - ' (למשל '1 - alice.rossi@example.com'). הזמנה לפי תעודת זהות.

טוען עורך...
הצג רמז

ה || אופרטור דורש אופרנדים מאותו סוג: העברה של מזהה לטקסט היא הדרך הנקייה ביותר.

הפתרון זמין לאחר 3 ניסיונות