CodeGym /課程 /SQL SELF /用 CAST() 和 :: 做資料型別轉換 — 範例與小細節

用 CAST() 和 :: 做資料型別轉換 — 範例與小細節

SQL SELF
等級 5 , 課堂 3
開放

想像一下,你想把兩個數字加起來,但其中一個參數是用字串存的。或者你想根據年份來篩選資料,但你的日期是完整格式還帶時間。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 或多加一些檢查來防呆。

留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION