মূল কন্টেন্টে যান
মডিউল 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লোড হচ্ছে...

প্রতিটি অর্ডারের জন্য, আইডি এবং দিন দেখান (শুধুমাত্র অর্ডারের তারিখের অংশ, প্রকারের তারিখ)। দুই কলাম। আইডি দিয়ে অর্ডার করুন।

সম্পাদক লোড হচ্ছে...
ইঙ্গিত দেখান

TIMESTAMP → DATE কাস্ট সময় কমিয়ে দেয়: ordered_at::date।

সমাধান 3 প্রচেষ্টার পরে উপলব্ধ

ব্যায়াম পর্যালোচনা করুন

ব্যায়াম#sql.m6.l4.e2
প্রচেষ্টা: 0লোড হচ্ছে...

প্রতিটি গ্রাহকের জন্য একটি লেবেল কলাম দেখান যা আইডি এবং ইমেলকে ' - ' (যেমন '1 - alice.rossi@example.com') দ্বারা পৃথক করে। আইডি দিয়ে অর্ডার করুন।

সম্পাদক লোড হচ্ছে...
ইঙ্গিত দেখান

দ || অপারেটরের একই ধরনের অপারেন্ড প্রয়োজন: টেক্সট আইডি কাস্ট করা সবচেয়ে পরিষ্কার উপায়।

সমাধান 3 প্রচেষ্টার পরে উপলব্ধ