今天我們要來聊一下陣列,這是 PostgreSQL 裡面很強大的工具之一,可以讓你在一個欄位裡存放同一型別的值的清單。之後我們還會在進階課程更深入聊陣列。
講到「陣列」,大家應該會想到清單吧。就像你去超市前寫的購物清單:蘋果、香蕉、牛奶、麵包。在 PostgreSQL 裡,陣列就像這種清單,可以在一個欄位裡存很多值,而且每個值都要是同一種資料型別。比如說,數字陣列、文字陣列、日期陣列等等。
來看幾個例子:
數字陣列:
{1, 2, 3, 4}
字串陣列:
{"apple", "banana", "cherry"}
日期陣列:
{2024-10-01, 2024-10-02, 2024-10-03}
陣列可以讓你把很多值塞進同一個欄位,這樣可以省下表格空間,也讓查詢更彈性。
為什麼要用陣列?主要優點
資料儲存更精簡:可以把多個值放在同一個欄位。這對於本來就有邏輯關聯的資料超方便。像是文章的標籤清單,或學生的成績清單。為了幾個標籤還要另外開一張表?
查詢方便:用陣列可以一次拿到一整串值,也很容易操作陣列裡的單一元素。
效能:有時候用陣列可以不用另外建關聯表,讓資料庫架構更簡單,開發速度也會快一點。這樣誰不開心啦~
怎麼在 PostgreSQL 裡用陣列?
在 SELECT 裡建立陣列
要建立陣列可以用 ARRAY[] 這個語法。範例如下:
-- 數字陣列範例
SELECT ARRAY[1, 2, 3, 4];
-- 字串陣列範例
SELECT ARRAY['apple', 'banana', 'cherry'];
超簡單對吧。那我們來建個表,然後試著查點東西。
建立有陣列欄位的資料表
先來建一個表,其中一個欄位是陣列。
| id | name - VARCHAR(50) | subjects - TEXT[] |
|---|---|---|
| 1 | Alex | {數學,物理} |
| 2 | Maria | {化學,生物,英文} |
| 3 | Peter | {資訊學} |
來看看結果:
SELECT * FROM students;
| id | name | subjects |
|---|---|---|
| 1 | Alex | {數學,物理} |
| 2 | Maria | {化學,生物,英文} |
| 3 | Peter | {資訊學} |
從陣列取出資料
要從陣列裡拿資料,PostgreSQL 有很多函式跟運算子可以用。
取出陣列的某個元素
要根據索引拿到陣列的元素,可以用中括號 []。注意喔,索引從 1 開始(不是像大多數程式語言那樣從 0 開始)。
-- 取得每個學生的第一個科目
SELECT name, subjects[1] AS 第一個科目 FROM students;
查詢結果會像這樣:
| name | 第一個科目 |
|---|---|
| Alex | 數學 |
| Maria | 化學 |
| Peter | 資訊學 |
取出整個陣列欄位
要拿到整個陣列欄位,就直接用 SELECT:
SELECT name, subjects FROM students;
在陣列裡找特定值
有時候你會想知道陣列裡有沒有某個值。這時可以用 ANY 運算子。
-- 選出有學「數學」的學生
SELECT name
FROM students
WHERE '數學' = ANY(subjects);
查詢結果:
| name |
|---|
| Alex |
PostgreSQL 其實還有超多跟陣列有關的函式跟運算子,之後進階課程會再介紹 :P
用陣列時常見的錯誤
0 跟 1 的索引搞混。
在 PostgreSQL 裡,陣列的索引是從 1 開始。如果你習慣 Python 或 JavaScript 這種語言,很容易搞混。
空陣列。
空陣列 {} 跟 NULL 在 PostgreSQL 裡是不一樣的東西。比較陣列時不要搞混這兩個概念。
處理超大陣列。
如果你把一大堆資料都塞進一個陣列,查詢速度可能會變慢。建議陣列只用來存小量資料就好。
GO TO FULL VERSION