Skip to content

SQL-5.2 CAST & Type Conversion

ข้อมูลไม่ได้มาใน type ที่ถูกต้องเสมอ — บางทีตัวเลขถูกเก็บเป็น text, บางทีวันที่เป็น string — CAST คือเครื่องมือแปลง type อย่าง explicit ที่คุณควบคุมได้

-- Syntax: CAST(expression AS target_type)
-- String → Integer
SELECT CAST('42' AS INTEGER); -- 42
-- String → Numeric
SELECT CAST('3.14' AS NUMERIC(5,2)); -- 3.14
-- Integer → VARCHAR
SELECT CAST(42 AS VARCHAR); -- '42'
-- String → Date
SELECT CAST('2025-08-15' AS DATE); -- 2025-08-15
-- PostgreSQL shortcut: ::
SELECT '42'::INTEGER; -- 42
SELECT 42::VARCHAR; -- '42'
SELECT '2025-08-15'::DATE; -- 2025-08-15
-- Implicit: database แปลงให้อัตโนมัติ (อันตราย!)
SELECT '10' + 5;
-- PostgreSQL: ERROR! ไม่ auto cast string + int
-- MySQL: 15 (auto cast '10' → 10)
-- Explicit: คุณควบคุมเอง (ปลอดภัย)
SELECT CAST('10' AS INTEGER) + 5; -- 15 ในทุก database
-- ปัญหาของ implicit conversion:
SELECT * FROM students
WHERE student_id = 1;
-- ถ้า student_id เป็น VARCHAR → database อาจ:
-- 1. Cast ทุกแถว VARCHAR → INT (ช้า, ไม่ใช้ index)
-- 2. Error (PostgreSQL strict mode)
-- 3. ให้ผลผิด
-- Pattern 1: แปลง price จาก text เป็น number
SELECT CAST(price_text AS NUMERIC(10,2)) AS price
FROM raw_data
WHERE price_text ~ '^\d+\.?\d*$'; -- เช็คว่าเป็นตัวเลขก่อน
-- Pattern 2: แปลง date จาก text
SELECT CAST(date_text AS DATE) AS proper_date
FROM raw_data
WHERE date_text ~ '^\d{4}-\d{2}-\d{2}$'; -- เช็ค format ก่อน
-- Pattern 3: COALESCE + CAST สำหรับ NULL-safe conversion
SELECT COALESCE(CAST(nullable_col AS INTEGER), 0) AS safe_int
FROM some_table;
-- Pattern 4: TRY_CAST (SQL Server) / safe casting
-- PostgreSQL ไม่มี TRY_CAST — ใช้ CASE WHEN แทน
SELECT
CASE
WHEN price_text ~ '^\d+\.?\d*$'
THEN CAST(price_text AS NUMERIC(10,2))
ELSE NULL
END AS safe_price
FROM raw_data;
หัวข้อจำ
CAST(x AS type)Standard SQL — ใช้ได้ทุก database
x::typePostgreSQL shortcut
Implicit conversionอันตราย — แต่ละ database ทำต่างกัน
Validate ก่อน CASTป้องกัน runtime error