CodeGym /課程 /SQL SELF /在陣列中搜尋資料: ANYALLar...

在陣列中搜尋資料: ANYALLarray_contains()

SQL SELF
等級 35 , 課堂 4
開放

陣列常常用來在一個欄位裡存很多值——像是標籤、號碼、角色或偏好之類的。但要怎麼知道陣列裡有沒有我們要的值,或是反過來——全部元素都符合某個條件?PostgreSQL 給我們很方便的工具來做這種檢查:ANYALLarray_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}

常見錯誤與避免方法

你在用陣列查資料時,特別是搜尋時,有幾個小陷阱要注意。

錯誤:ANYALL 用錯。 比如你不小心把運算子用反了,結果就會怪怪的。

-- 錯誤範例:
SELECT *
FROM students
WHERE hobbies = ANY('閱讀');

這裡的錯誤是 hobbies 是陣列,'閱讀' 是字串。應該要用 ANY 去檢查陣列,而不是反過來。

錯誤:陣列索引從 1 開始,不是 0。 如果你用其他函式或手動取元素,要記得 PostgreSQL 的陣列是從 1 開始算的。

錯誤:沒加索引。 如果你常常用 ANYALL 查陣列,記得加索引,查詢會快很多。

1
問卷/小測驗
陣列與操作陣列,等級 35,課堂 4
未開放
陣列與操作陣列
陣列與操作陣列
留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION