שיעורי מודול (4/4)
המרות CAST וסוג
SQL מוקלד חזק: לכל עמודה יש סוג (INTEGER, TEXT,
NUMERIC, DATE, TIMESTAMP...), ופעולות רבות דורשות את הסוגים
כדי להתאים. כאשר הם לא - או כאשר אתה רוצה לעצב ערך
אחרת - אתה משתמש ב-cast.
שני תחבירים שווים
-- SQL standard:
CAST(123 AS TEXT)
-- PostgreSQL shorthand (più comune nella pratica):
123::textשתי הצורות זהות. הקיצור ::type הוא יותר קומפקטי ו
שרשראות יפה עם ביטויים אחרים:
SELECT ordered_at::date AS day,
(oi.quantity * oi.unit_price)::numeric(10,2) AS total,
id::text || ' - ' || email AS label
FROM …;השלכות שימושיות על מערך הנתונים
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כאשר שחקנים יכולים להיכשל
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 / ביטוי רגיל.
שחקנים והזמינו לפי
מקרה שמייצר באגים עדינים: מיון מספרים מאוחסנים כטקסט.
SELECT '2', '10', '1' ORDER BY 1; -- '1', '10', '2' (alfabetico!)פתרון: יצוק בתוך ORDER BY:
SELECT code FROM articles ORDER BY code::int;נסה את זה
עבור כל הזמנה, הצג מזהה ויום (רק חלק התאריך של ordered_at, של סוג תאריך). שני עמודים. הזמנה לפי תעודת זהות.
הצג רמז
ההעברה TIMESTAMP → DATE מוריד את השעה: ordered_at::date.
הפתרון זמין לאחר 3 ניסיונות
סקירת התרגיל
עבור כל לקוח הצג עמודת תווית שמשרשרת מזהה ואימייל מופרדים ב-' - ' (למשל '1 - alice.rossi@example.com'). הזמנה לפי תעודת זהות.
הצג רמז
ה || אופרטור דורש אופרנדים מאותו סוג: העברה של מזהה לטקסט היא הדרך הנקייה ביותר.
הפתרון זמין לאחר 3 ניסיונות