更新於 2024/04/06閱讀時間約 12 分鐘

QUERY 函式大解析(二):WHERE

嘿,大家好!我是喜特先生,Mr. Sheet。不知道大家的 SELECT 用得如何?
這是 QUERY 函式大解析系列文章的第二篇,建議你先看過第一篇 QUERY 函式的原理和 SELECT 並實際練習操作後,再來看這篇文章唷!(延伸閱讀:QUERY 函式大解析(一):基本原理與 SELECT)
我們上次聊到了怎麼用 SELECT 選取整個資料範圍和特定欄位,這次我們要來介紹怎麼用 WHERE 來更進一步指定搜尋條件,回傳符合條件的資料
我在方格子上寫了一系列使用 QUERY 的教學文章,也歡迎你來看看:
QUERY 函式大解析,系列文索引
我們來看看究竟這個 WHERE 是什麼,還有為什麼這麼實用吧!

WHERE 是什麼

「當符合某條件的時候,回傳資料」的意思。WHERE 語法可以指定搜尋條件,要 QUERY 只回傳符合條件的資料。所謂的「條件」可以分成下列幾種:
WHERE 可以讓你對「欄」指定搜尋條件,不是「列」喔!WHERE 會去搜尋欄裡面相符指定條件的資訊,並回傳結果。
接下來會針對每個條件類型,來講解怎麼用、什麼時候用。

比較運算子
= 等於 「這欄等於 ### 的值都回傳給我吧」的意思。可以用來等於數值或是文字。記得如果要做文字的處理,要放上「單引號」(因為我們的 QUERY 語法本身就帶有雙引號、再用雙引號會產生錯誤)!
WHERE A = 100
WHERE B = '喜特先生'
WHERE C = 'abc'
!=、 不等於 「這欄不等於 ### 的值都回傳給我吧」。兩個寫法(!=、)都可以,可以用來不等於數值或是文字。
WHERE A != 100
WHERE B != '喜特先生'
WHERE C <> 'abc'
、、=、= 大於、小於、大於等於、小於等於 「這欄__於 ### 的值都回傳給我吧」的意思。
WHERE A > 100
WHERE B <= 50
WHERE C < 1000

空值
is null 為空值 「這欄裡面只要儲存格是空值的資料都回傳給我吧」的意思。
WHERE A is null
is not null 不為空值 「這欄裏面只要儲存格不是空值的資料都回傳給我吧」。通常會用在過濾掉空的儲存格的資料,很方便的語法。
WHERE B is not null

文字搜尋
要先注意,如果你要搜尋的資料是英文的話,大小寫有差!在做搜尋的時候可以先看一下原本的資料是怎麼寫的,再進行 QUERY。
contains 含有…的文字 「這欄含有 ### 的文字的資料都回傳給我吧」的意思。只要含有特定字元,就會回傳結果。
WHERE A contains '喜特先生'
例如說你想找資料欄裡含有「育」的資料,你會得到「私立才國小」、「市立德國小」、「市立英國小」等等含有「育」字的結果。
舉個英文大小寫要注意的例子:例如你想找 John,「John Adams」、「Long John Silver」會列入結果,但「john adams」不會被算在裡面,因為 john 的 j 不是大寫。
starts with 以…開始的文字 「這欄以 ### 為開始的文字的資料都回傳吧!」的意思。
WHERE B starts with '喜'
如搜尋以「市立」開始的資料,就會得到「市立北大國小」、「市立新林國小」、「市立板橋國小」等等以「市立」開始的結果。如果是英文的話邏輯也一樣,搜尋以「e」開始的資料,會得到「engineering」、「eng」、「eat」等等。
ends with 以…結束的文字 「這欄以 ### 為結束的文字的資料都回傳吧!」的意思。
WHERE C ends with '生'
像是搜尋以「777」為結尾的資料,就會得到「(02)…777」、「(03)…777」的結果。英文也是,搜尋以「y」結尾的資料,會得到「cowboy」、「boy」、「my」等等的結果。
其他還有兩個我們沒介紹,是更進階的 matches 還有 like 。它們可以做更細緻的搜尋,但礙於篇幅我們之後再講解講解了。

邏輯運算子
假想你今天在新聞看到,你最愛的老婆們終於要來台灣開握手會:
「我想去新垣結衣的握手會」 「我想去吉岡里帆的握手會」
但如果可以的話,「小孩子才做選擇,我全都要嘛!」所以你開始思考達成兩樣條件的可能性。
我們把「前往結衣的握手會」當成一個條件,「前往吉岡的握手會」當另一個條件,得到的可能性就是我們的 QUERY 結果。
我們就以這個打比方,來解釋 QUERY 裡支援的三個邏輯運算子。
AND 且 — 「小孩子才做選擇,我兩場握手會全都要去!」
「把同時符合條件 A 和條件 B 的結果都傳給我吧」的意思。
WHERE A 條件 AND B 條件
WHERE A = '新垣結衣' AND B = '吉岡里帆'
如果今天有三個或更多的條件,你也可以用 And 串連起來,也就是「把同時符合條件 A、條件 B、條件 C⋯條件 N 的值都給我吧」的意思。
OR 或 — 「好吧,我只能去其中一個,但是不管去哪一個,我就很滿意了」
「把符合任何條件資料都傳給我吧!」的意思。
WHERE A 條件 OR B 條件
WHERE A = '新垣結衣' OR B = '吉岡里帆'
同理可證,三個以上的條件時,也是「把符合條件 A、或條件 B、或條件 C ⋯或條件 N 的資料都傳給我吧!」的意思。
NOT 不反轉自己設定的條件
「把不符合這個條件的資料都傳給我吧!」的意思。
WHERE NOT A 條件
WHERE NOT A 條件 AND NOT B 條件
切記要把 NOT 寫在條件前面否定才會生效!
當然如果覺得太麻煩,也可以適度用剛剛介紹到的「is not null」、「」、「!=」來達成你的搜尋。
你也可以用這些邏輯運算子做出不同排列組合:
符合 A 是新垣結衣且 B 是吉岡里帆、但 C 不是有村架純:
WHERE A = '新垣結衣' AND B = '吉岡里帆' AND NOT C = '有村架純'
如果你有多個條件,也可以用括號()讓 QUERY 知道你要優先執行這個條件,像是:
WHERE (A = '新垣結衣' AND B = '吉岡里帆') OR C = '有村架純'
再加上前面的比較運算子、文字搜尋和空值的運用,你可以篩選出不少資訊了!

WHERE 語法怎麼寫?

寫在 SELECT 後面就可以了。也就是:
=QUERY(資料, "SELECT ... WHERE ...")
如果有很多搜尋條件、用邏輯運算子串連,你可以這樣寫(以 AND 為例):
=QUERY(資料, "SELECT ...
            WHERE A = ###
              AND B = ###
              AND C = ###...")

現在是練習時間!

打開試算表、複製後,你會看到一份名單。
(免責聲明:這個名單上面的資訊都是用各種不同的生成器做出來的,如有雷同,真的是巧合)
每一個欄位的資料類型都是文字,所以我們稍後的搜尋都要記得用單引號括起來。來出幾個題目:

一、搜尋所有性別是女性的資料
我們先把剛剛的結構搬出來看一下:
=QUERY(資料, "SELECT ... WHERE ...")
資料:無庸置疑,我們的資料範圍很明顯就是這個名單的 A 欄到 E 欄了。
語法:我們要全部的欄位,就用 SELECT * 把全部的欄位包起來。再來就是 WHERE 的條件,我們要找性別(C欄)是「女」的資訊。
條件:用等於(=)就可以解決了!
那我們就回到 QUERY 的試算表,寫下 =QUERY 後,定義資料的範圍:
=QUERY('資料'!A:E
再來打個逗點,寫下 SELECT 的欄位有什麼:
=QUERY('資料'!A:E, "SELECT *
最後就是 WHERE!空一格,來指定一下條件:C 欄等於「女」。別忘了把「女」這個字符用單引號括起來:
=QUERY('資料'!A:E,"SELECT * WHERE C = '女'")
痛快按下 Enter 鍵:
你可能也注意到這個搜尋結果沒有標題列吧?如果你需要標題的話,可以在 QUERY 的最後一個參數那邊打上一個 1,告訴 QUERY 我這邊有一列標題。語法像是這樣:
=QUERY('資料'!A:E, "SELECT * WHERE C = '女'", 1)
雖然我們前面提到「標題」這個參數可以省略,QUERY 可以偵測資料是否含有標題列,但好像對中文的資料不是太有效,建議還是可以加上 1 來確保搜尋結果安全無虞。

二、搜尋所有姓氏是「林」的人員資料
我們的資料範圍不變,SELECT 的範圍也不變,只需要考慮 WHERE 怎麼寫就行了!中文的姓氏是姓名的第一個字,我覺得用「以…開始」的 starts with 應該滿適合的:
=QUERY('資料'!A:E, "SELECT * WHERE A starts with '林'", 1)

三、搜尋所有姓氏是「李」且性別是「女」的人員資料
再來我們就來試試看用邏輯運算子,用 and 來連接兩個條件。
這邊的條件A是「姓氏是李」、條件B是「性別是女」。我們要找同時符合兩個條件(也就是「且」)的話,會用到 and。如果你還不太確定條件A跟條件B怎麼寫的話,就是:
姓氏是李:WHERE A starts with '李'
性別是女:WHERE C = '女'
接下來我們把兩個條件結合起來,就會變成:
WHERE A starts with '李' and WHERE C = '女'
但這邊的 WHERE 寫了兩次,我們只需要寫一次即可。也就是:
WHERE A starts with '李' and C = '女'
這樣就行了!接下來就把前面的資料範圍、還有 SELECT、指定標題列寫好的話,就會像是這樣:
=query('資料'!A:E, "SELECT *
WHERE A starts with '李' and C = '女'",1)
執行結果就會像是這個樣子:

讀到這裡,大家辛苦了!到目前為止我們已經學到了怎麼用 WHERE 來限制搜尋條件,進一步篩選出想要的結果。到這邊其實已經學會了 QUERY 的一大部分,多多習慣 WHERE、就可以很有效率地在茫茫大海裡面找到資料。
如果你喜歡這次的文章,歡迎你透過這些方法支持我:
・按下愛心、按下儲存
・留言告訴我你的想法
・加入喜特先生的官方沙龍,即時看到我發布的教學
・付費訂閱喜特先生的官方沙龍,加入每月小額訂閱方案
・追蹤喜特先生的 Facebook
・按這邊小額贊助我的創作!
想要看更多文章,歡迎來到我的 Notion 頁面找找有沒有你需要的資源喔!
我是喜特先生,Mr. Sheet,我們下個教學見!

分享至
成為作者繼續創作的動力吧!
© 2024 vocus All rights reserved.