SQL-5.2 CAST & Type Conversion
ข้อมูลไม่ได้มาใน type ที่ถูกต้องเสมอ — บางทีตัวเลขถูกเก็บเป็น text, บางทีวันที่เป็น string — CAST คือเครื่องมือแปลง type อย่าง explicit ที่คุณควบคุมได้
CAST — Explicit Type Conversion
Section titled “CAST — Explicit Type Conversion”-- Syntax: CAST(expression AS target_type)
-- String → IntegerSELECT CAST('42' AS INTEGER); -- 42
-- String → NumericSELECT CAST('3.14' AS NUMERIC(5,2)); -- 3.14
-- Integer → VARCHARSELECT CAST(42 AS VARCHAR); -- '42'
-- String → DateSELECT CAST('2025-08-15' AS DATE); -- 2025-08-15
-- PostgreSQL shortcut: ::SELECT '42'::INTEGER; -- 42SELECT 42::VARCHAR; -- '42'SELECT '2025-08-15'::DATE; -- 2025-08-15Sheets มี implicit conversion เกือบทุกอย่าง:
="100" + 1 → 101 (auto แปลง text → number)=VALUE("42") → 42 (explicit แปลง text → number)=TEXT(42, "000") → "042" (explicit แปลง number → text)=DATEVALUE("2025-08-15") → serial numberข้อเสีย: Sheets ไม่บอกคุณว่ามันแปลงเมื่อไหร่ → อาจเกิด bugs แบบเงียบๆ
# Python explicit conversionint("42") # 42str(42) # '42'float("3.14") # 3.14
# Pandasdf['price'] = df['price'].astype(float)df['id'] = df['id'].astype(str)
# pd.to_datetime สำหรับวันที่df['date'] = pd.to_datetime(df['date_str'])#include <stdio.h>#include <stdlib.h>
int main() { // C explicit casting char *str_num = "42"; int num = atoi(str_num); // string → int double fnum = atof("3.14"); // string → double
// int → string char buffer[20]; sprintf(buffer, "%d", num); // int → string
// type casting (reinterpret bits) int i = 65; char c = (char)i; // 65 → 'A' printf("%d → '%c'\n", i, c);
return 0;}Implicit vs Explicit Conversion
Section titled “Implicit vs Explicit Conversion”-- 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 studentsWHERE student_id = 1;-- ถ้า student_id เป็น VARCHAR → database อาจ:-- 1. Cast ทุกแถว VARCHAR → INT (ช้า, ไม่ใช้ index)-- 2. Error (PostgreSQL strict mode)-- 3. ให้ผลผิดSheets ใช้ implicit conversion เกือบทุกอย่าง — ซึ่งทำให้ debug ยากมาก:
="10" + 5 → 15 (auto cast)="abc" + 5 → #VALUE! (ไม่สามารถ cast)=TRUE + 1 → 2 (TRUE = 1)# Python ค่อนข้าง strict"10" + 5 # TypeError! ไม่ auto castint("10") + 5 # 15 — ต้อง explicit
# แต่ numeric types auto cast10 + 3.14 # 13.14 — int → float อัตโนมัติ// C มี implicit casting สำหรับ numeric typesint a = 10;double b = 3.14;double c = a + b; // a ถูก implicit cast เป็น double// c = 13.14
// แต่ string ↔ number ต้อง explicit เสมอ// atoi(), atof(), sprintf()Safe Patterns
Section titled “Safe Patterns”-- Pattern 1: แปลง price จาก text เป็น numberSELECT CAST(price_text AS NUMERIC(10,2)) AS priceFROM raw_dataWHERE price_text ~ '^\d+\.?\d*$'; -- เช็คว่าเป็นตัวเลขก่อน
-- Pattern 2: แปลง date จาก textSELECT CAST(date_text AS DATE) AS proper_dateFROM raw_dataWHERE date_text ~ '^\d{4}-\d{2}-\d{2}$'; -- เช็ค format ก่อน
-- Pattern 3: COALESCE + CAST สำหรับ NULL-safe conversionSELECT COALESCE(CAST(nullable_col AS INTEGER), 0) AS safe_intFROM 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_priceFROM raw_data;| หัวข้อ | จำ |
|---|---|
CAST(x AS type) | Standard SQL — ใช้ได้ทุก database |
x::type | PostgreSQL shortcut |
| Implicit conversion | อันตราย — แต่ละ database ทำต่างกัน |
| Validate ก่อน CAST | ป้องกัน runtime error |