陣列常常用來在一個欄位裡存很多值——像是標籤、號碼、角色或偏好之類的。但要怎麼知道陣列裡有沒有我們要的值,或是反過來——全部元素都符合某個條件?PostgreSQL 給我們很方便的工具來做這種檢查:ANY、ALL 跟 array_contains()。我們一個一個來看。
什麼是 ANY?
想像一下,你有個陣列,裡面有一堆值,比如商品 ID、電話號碼或興趣清單。常常會遇到要檢查某個值在不在這個陣列裡。這時候 ANY 運算子就派上用場啦。它可以幫你檢查「我們要找的東西」是不是在陣列裡。
ANY 的語法
SELECT *
FROM your_table
WHERE value = ANY(array_column);
這裡:
array_column—— 就是我們要檢查的陣列。value—— 就是我們要在陣列裡找的那個值。
ANY 的使用範例
假設我們有一個 students 表,結構長這樣:
| id | name | hobbies |
|---|---|---|
| 1 | Otto | {閱讀, 游泳, 西洋棋} |
| 2 | Eva | {音樂, 閱讀, 運動} |
| 3 | Alex | {繪畫, 音樂} |
| 4 | Maria | {西洋棋, 足球} |
我們想找興趣裡有游泳的學生。查詢會長這樣:
SELECT *
FROM students
WHERE '游泳' = ANY(hobbies);
結果:
| id | name | hobbies |
|---|---|---|
| 1 | Otto | {閱讀, 游泳, 西洋棋} |
簡單說,ANY 就是在問:「這個陣列裡有這個值嗎?」
信就信到底!用 ALL
現在想像反過來:你要確定所有陣列元素都符合某個規則。這時 PostgreSQL 有 ALL 運算子。它可以幫你檢查所有元素是不是都等於某個值、都大於某個數字,或是符合其他邏輯條件。
ALL 的語法
SELECT *
FROM your_table
WHERE value < ALL(array_column);
這裡:
array_column—— 就是我們要檢查的陣列。value < ALL(...)代表所有陣列元素都要比這個值大。
回到我們的 students 表。假設我們想找所有興趣都以「閱」開頭的學生。查詢:
SELECT *
FROM students
WHERE '閱讀' = ALL(hobbies);
結果會是空的,因為沒有人所有興趣都等於「閱讀」。為了讓例子更直觀(也真的查得到),我們來看數字資料。
假設有個 orders 表:
| id | customer | prices |
|---|---|---|
| 1 | Otto | {100, 200, 300} |
| 2 | Eva | {50, 60, 70} |
| 3 | Alex | {500, 600, 700} |
找出所有每個價格都小於 400 的訂單:
SELECT *
FROM orders
WHERE 400 > ALL(prices);
結果:
| id | customer | prices |
|---|---|---|
| 1 | Otto | {100, 200, 300} |
| 2 | Eva | {50, 60, 70} |
根據陣列內容過濾資料列
我們剛剛看了基本的查詢方法和運算子,那實際上要怎麼用?來看幾個例子。
範例 1:找出至少有一個興趣是音樂的學生
原始表格:
| id | name | hobbies |
|---|---|---|
| 1 | Otto | {閱讀, 音樂, 跑步} |
| 2 | Eva | {繪畫, 游泳} |
| 3 | Maria | {音樂, 拳擊} |
| 4 | Alex | {足球, 拳擊, 桌遊} |
SELECT *
FROM students
WHERE '音樂' = ANY(hobbies);
結果:
| id | name | hobbies |
|---|---|---|
| 1 | Otto | {閱讀, 音樂, 跑步} |
| 3 | Maria | {音樂, 拳擊} |
範例 2:找出所有價格都大於 100 的訂單
原始 orders 表:
| id | customer | prices |
|---|---|---|
| 1 | Otto | {150, 200, 300} |
| 2 | Eva | {50, 120, 130} |
| 3 | Maria | {200, 250, 100} |
| 4 | Alex | {110, 115, 120} |
SELECT *
FROM orders
WHERE 100 < ALL(prices);
結果:
| id | customer | prices |
|---|---|---|
| 1 | Otto | {150, 200, 300} |
| 4 | Alex | {110, 115, 120} |
常見錯誤與避免方法
你在用陣列查資料時,特別是搜尋時,有幾個小陷阱要注意。
錯誤:ANY 或 ALL 用錯。 比如你不小心把運算子用反了,結果就會怪怪的。
-- 錯誤範例:
SELECT *
FROM students
WHERE hobbies = ANY('閱讀');
這裡的錯誤是 hobbies 是陣列,'閱讀' 是字串。應該要用 ANY 去檢查陣列,而不是反過來。
錯誤:陣列索引從 1 開始,不是 0。 如果你用其他函式或手動取元素,要記得 PostgreSQL 的陣列是從 1 開始算的。
錯誤:沒加索引。 如果你常常用 ANY、ALL 查陣列,記得加索引,查詢會快很多。
GO TO FULL VERSION