想像一下,你想把兩個數字加起來,但其中一個參數是用字串存的。或者你想根據年份來篩選資料,但你的日期是完整格式還帶時間。PostgreSQL 可能會對你的想法有點不爽,你就得自己動手,把資料轉成對的型別才行。
型別轉換可以幫你:
- 讓資料更好處理,可以直接拿來算。
- 讓資料更好看、更有結構,方便 export 或分析。
- 解決資料型別不合造成的 bug。
資料型別轉換基本功:CAST() 跟 ::
1. CAST() — 轉型界的老大哥
CAST() 這個 function 算是「官方」的型別轉換方法,什麼型別都能轉,超萬用的翻譯機。
語法:
CAST(值 AS 目標_資料型別)
範例 1:把字串轉成數字。
SELECT CAST('123' AS INTEGER); -- 結果: 123
範例 2:把數字轉成字串。
SELECT CAST(123 AS TEXT); -- 結果: '123'
範例 3:把日期轉成字串。
SELECT CAST(NOW() AS TEXT); -- 結果: '2023-10-25 15:00:00.000000'
2. Operator :: — 超精簡的替代方案
如果你覺得 CAST() 太囉唆,PostgreSQL 也有 :: 這種語法。這是個很短的寫法,因為夠簡潔所以超多人愛用。
語法:
值::目標_資料型別
範例 1:把字串轉成數字。
SELECT '123'::INTEGER; -- 結果: 123
範例 2:把數字轉成字串。
SELECT 123::TEXT; -- 結果: '123'
範例 3:把日期轉成字串。
SELECT NOW()::TEXT; -- 結果: '2023-10-25 15:00:00.000000'
型別轉換的實戰範例
1. 數字跟字串的轉換
假設你有一個 students table,裡面的 student_id 是用字串存的,但你想拿它跟數字比。沒轉型的話,根本比不出來。
| student_id | first_name | last_name | birth_date | grade |
|---|---|---|---|---|
| 101 | Alex | Lin | 2008-03-15 | 9 |
| 102 | Maria | Chi | 2009-07-22 | 8 |
| 103 | Axel | Ivy | 2007-11-30 | 10 |
| 104 | Nat | Sok | 2008-01-18 | 9 |
| 105 | Pol | Frez | 2009-05-05 | 8 |
所以你查詢時要明確把 student_id 轉成數字:
SELECT *
FROM students
WHERE student_id::INTEGER = 101;
用 CAST() 寫法也可以:
SELECT *
FROM students
WHERE CAST(student_id AS INTEGER) = 101;
日期的轉換
有時候你想抓出日期的一部分或把它轉成字串,型別轉換就很有用。比如你有個 courses table,裡面 start_date 是課程開始的日期。
| course_id | course_name | start_date |
|---|---|---|
| 1 | Python 入門 | 2025-01-15 |
| 2 | SQL 基礎 | 2025-03-01 |
| 3 | 資料分析 | 2025-05-10 |
| 4 | 網頁開發 | 2025-06-20 |
| 5 | 機器學習 | 2025-09-05 |
範例:把年份抓出來當數字用。
SELECT start_date::DATE, start_date::TEXT, start_date::TIMESTAMP
FROM courses;
查詢結果會像這樣:
| start_date (DATE) | start_date (TEXT) | start_date (TIMESTAMP) |
|---|---|---|
| 2025-01-15 | 2025-01-15 | 2025-01-15 00:00:00 |
| 2025-03-01 | 2025-03-01 | 2025-03-01 00:00:00 |
| 2025-05-10 | 2025-05-10 | 2025-05-10 00:00:00 |
| 2025-06-20 | 2025-06-20 | 2025-06-20 00:00:00 |
| 2025-09-05 | 2025-09-05 | 2025-09-05 00:00:00 |
範例:把日期轉成「純字串」。
SELECT TO_CHAR(start_date, 'DD-MM-YYYY')
查詢結果會像這樣:
| to_char |
|---|
| 15-01-2025 |
| 01-03-2025 |
| 10-05-2025 |
| 20-06-2025 |
| 05-09-2025 |
錯誤:什麼時候轉型會爆炸?
型別轉換不是每次都 work。有時 PostgreSQL 會直接跟你說「我看不懂你要幹嘛」。最經典的例子就是你想把一個看起來像數字的字串轉成數字,但裡面有多餘的符號。
錯誤範例:
SELECT '123abc'::INTEGER;
-- 錯誤: invalid input syntax for type integer: "123abc"
要避免這種狀況,記得先確定資料真的能轉成你要的型別。你可以用 regular expression 或多加一些檢查來防呆。
GO TO FULL VERSION