मुख्य सामग्री पर जाएं
मॉड्यूल 6 · पाठ 4 का 4पाठ्यक्रम में 24/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 का दिनांक भाग, दिनांक प्रकार का)। दो कॉलम. आईडी द्वारा ऑर्डर करें.

संपादक लोड हो रहा है...
संकेत दिखाएँ

टाइमस्टैम्प → दिनांक कास्ट समय को कम कर देता है: order_at::date।

3 प्रयासों के बाद समाधान उपलब्ध है

व्यायाम की समीक्षा करें

व्यायाम#sql.m6.l4.e2
प्रयास: 0लोड हो रहा है...

प्रत्येक ग्राहक के लिए एक लेबल कॉलम दिखाएं जो आईडी और ईमेल को '-' से अलग करता है (उदाहरण के लिए '1 - alice.rossi@example.com')। आईडी द्वारा ऑर्डर करें.

संपादक लोड हो रहा है...
संकेत दिखाएँ

|| ऑपरेटर को एक ही प्रकार के ऑपरेंड की आवश्यकता होती है: आईडी को टेक्स्ट में डालना सबसे साफ तरीका है।

3 प्रयासों के बाद समाधान उपलब्ध है