QUERY 函式大解析(十三):MATCHES「|」用 TEXTJOIN 與範圍連動

2024/02/16閱讀時間約 9 分鐘

這邊有個台灣的旅宿清單,有各個旅宿的資訊:

我想用 QUERY 找位於「高雄市、臺南市、屏東縣、臺東縣」的旅宿資訊。如果用 OR 來寫:

=QUERY(..., "SELECT ... WHERE A = '高雄市'
OR A = '臺南市'
OR A = '屏東縣'
OR A = '臺東縣'")

用上次介紹的 MATCHES|」來寫:

=QUERY(..., "SELECT ... WHERE A MATCHES '高雄市|臺南市|屏東縣|臺東縣'")


那麽如果我們希望 QUERY 能跟範圍內的資料連動,又要怎麼做呢?

像是下面這邊,我們想用 QUERY 找位於 G 欄的「高雄市、臺南市、屏東縣、臺東縣」旅宿資訊:

raw-image

要怎麼寫呢?如果要按照之前介紹過的 QUERY 函式大解析(九):與儲存格連動,用「&」串連的話:

=QUERY(..., "SELECT ... WHERE A = '" & G2 & "'
OR A = '" & G3 & "'
OR A = '" & G4 & "'
OR A = '" & G5 & "'")

但是這方法得一個個指定儲存格,且如果日後清單再繼續增加或減少的話,就得再編輯 OR,這方法有點不太理想。

那怎麼寫更好呢?可以用 WHEREMATCHES 搭配 TEXTJOIN 函式來寫。

今天來分享 MATCHES|」跟 TEXTJOIN 的另一個應用,讓你的 QUERY 可以更彈性,條件是一個範圍的資料也能迎刃而解。

歡迎來這邊複製一份練習用的試算表,一起來做做看!先打開「練習」工作表,你會看到 A 到 E 欄是等等要 QUERY 的地方, G 欄有縣市清單:

raw-image

這次會提到三個之前介紹過的概念,如果想要複習的話,也歡迎來這看看:




思路

我們的目標是做出這樣的 QUERY

=QUERY('台灣旅宿網旅宿清單'!A:L,
"SELECT C, A, B, K, L
WHERE A MATCHES '高雄市|臺南市|屏東縣|臺東縣'")

來看看那個 WHERE我們要試著把 MATCHES 後面的那串跟縣市清單連在一起,讓它成為「高雄市|臺南市|屏東縣|臺東縣」這樣的正規表達式咒語

怎麼做呢?先說結論,有兩個步驟:

  1. TEXTJOIN 函式,把縣市清單內的儲存格以「|」為連結字元串在一起,形成一個像是「a|b|c|d|...」的文字,即是正規表達式的「咒語」。
  2. & 字元與第一個步驟的結果連接,把它跟 MATCHES 接上。

這樣就可以讓 QUERY 跟範圍連動在一起了。


第一步:TEXTJOIN 函式

我們先在 H2 寫 TEXTJOIN 函式,把縣市清單串在一起看看吧。輸入:

=TEXTJOIN("|", TRUE, G2:G)
  • 串連字元:|
  • 忽略空白:是
  • 範圍:G2 到 G(整個 G2 以下的範圍)
raw-image

結果就順利顯示了我們要的正規表達式「咒語」:

raw-image

你可以在 G 欄的清單這邊加入新的縣市,看看 H2 的結果會不會跟著改變。我這邊加入了「花蓮縣」,H2 ​成功跟著連動了:

raw-image



第二步:用 & 字元跟 TEXTJOIN 結果連接,把它跟 MATCHES 接上

好,既然要讓 QUERY 可以跟儲存格互動,要出動 & 啦!我們在 A2,按照題目需求先完成前半段的 QUERY

=QUERY('台灣旅宿網旅宿清單'!A:L,
"SELECT C, A, B, K, L
WHERE A MATCHES
raw-image


因為等等要和 H2 的文字連結,我們要先起一個單引號「'」:

=QUERY('台灣旅宿網旅宿清單'!A:L,
"SELECT C, A, B, K, L
WHERE A MATCHES '

再來用雙引號「"」暫時先把目前的 QUERY 指令先關起來:

=QUERY('台灣旅宿網旅宿清單'!A:L,
"SELECT C, A, B, K, L
WHERE A MATCHES '"

然後我們用 & 字元,串連 H2:

=QUERY('台灣旅宿網旅宿清單'!A:L,
"SELECT C, A, B, K, L
WHERE A MATCHES '" & H2

再來寫第二個 &、準備繼續連接 QUERY 指令:

=QUERY('台灣旅宿網旅宿清單'!A:L,
"SELECT C, A, B, K, L
WHERE A MATCHES '" & H2 &

接著是雙引號「"」,準備把剩下的 QUERY 寫完:

=QUERY('台灣旅宿網旅宿清單'!A:L,
"SELECT C, A, B, K, L
WHERE A MATCHES '" & H2 & "

寫單引號「'」,讓 MATCHES 結束。

=QUERY('台灣旅宿網旅宿清單'!A:L,
"SELECT C, A, B, K, L
WHERE A MATCHES '" & H2 & "'

接下來我們還可以繼續寫其他的 QUERY 語句(ORDER BYLIMIT 等),舉例來說,按照 A 欄位做排序後再按 B 欄位排序:

=QUERY('台灣旅宿網旅宿清單'!A:L,
"SELECT C, A, B, K, L
WHERE A MATCHES '" & H2 & "'
ORDER BY A, B")

如果沒打算繼續寫的話,你可以寫上雙引號「"」讓 QUERY 語句結束:

=QUERY('台灣旅宿網旅宿清單'!A:L,
"SELECT C, A, B, K, L
WHERE A MATCHES '" & H2 & "'")

颯爽按下 Enter 鍵,看看結果:

raw-image

成功啦!你可以自由測試,把清單改成不同縣市,看看執行結果怎麼樣:

raw-image

當然你也可以一次把第一步跟第二步寫好,像這樣:

=QUERY('台灣旅宿網旅宿清單'!A:L,
"SELECT C, A, B, K, L
WHERE A MATCHES '" & TEXTJOIN("|", TRUE, G2:G) & "'")

結果也完全一樣的唷!


你可以考慮用這招,讓 TEXTJOIN 函式去取動態更新的範圍(像是 IMPORTRANGEQUERYFILTER 等),可以讓你的 QUERY 更有彈性喔!希望這招對你有幫助。



如果你喜歡這次的文章,歡迎你透過這些方法支持我:

  • 按下愛心、按下儲存
  • 留言告訴我你的想法
  • 加入喜特先生的官方沙龍,即時看到我發布的教學
  • 付費訂閱喜特先生的官方沙龍,加入每月小額訂閱方案
  • 追蹤喜特先生的 Facebook
  • 這邊小額贊助我的創作!

想要看更多文章的話,歡迎來到我的 Notion 頁面找找有沒有你需要的資源喔!

我是喜特先生,Mr. Sheet,我們下個教學見!


4.8K會員
139內容數
簡潔,快速,有效, 讓你的日常生活、工作生產力大提升! ___ 快按「加入」,馬上追蹤所有喜特先生的更新,有 Google 試算表教學、Google Apps Script 的研究、數據分析課程的開箱,還有 Google 試算表疑難雜症的解題分享唷!💪
留言0
查看全部
發表第一個留言支持創作者!