1. 概述
1.1 應用場景
模糊查詢,是一種很方便的查詢方式,用來查詢符合某種指定格式的資料。比如用戶想查詢所有姓張的銷售員的資料,就可以使用模糊查詢。
1.2 實現思路
模糊查詢也是一種 篩選查詢,但和精准查詢不同的是模糊查詢匹配方式是模糊匹配。我們知道篩選查詢 可以透過資料集參數和範本參數兩種方法實現,那模糊查詢也就對應兩種實現方式。
資料集參數:利用資料庫 SQL 語言的模糊搜尋,如 “like”、萬用字元“_”、“%”,對資料進行模糊查詢。
範本參數:透過設計器的“包含”、“開頭是”、“結尾是”等不完全匹配過濾條件過濾資料。
2. 實現方法
2.1 資料集參數
資料集參數 是定義在 SQL 語句中的參數,即在 SQL 查詢資料時,就實現了資料的過濾。如果你的資料是從資料庫查詢獲得,推薦使用此方法。
2.1.1 定義資料集參數
透過資料集參數實現模糊查詢時,首先要根據你想要實現的模糊匹配原則和所使用的資料庫支援的 SQL 語法定義一個資料集參數。
如使用 FRDemo 中銷量表,查詢某個姓氏的銷售員的資料。FRDemo是一個 SQLite 資料庫,支援 Like 匹配的用法,所以資料集參數可以如下定義:SELECT * FROM 銷量 where 銷售員 like '%${name}%',這樣就定義了一個 name 參數,只要銷售員姓名含有 name,就會被匹配到。
如下列出了一些資料庫中常用的模糊查詢的語法,使用者可以根據實際連結的資料庫選擇使用。
符號 | 定義 | 資料庫 | 語句 |
"%" | 表示任意 0 個或多個字元 | SQLServer Oracle MySQL | Select * from 表名 where 列名 like '%' //查詢出全部 Select * from 表名 where 列名 like 'x' //完全匹配查詢 Select * from 表名 where 列名 like '%x' //右為x,前面可以有任意位字元 Select * from 表名 where 列名 like 'x%' //左為x,後面可以有任意位字元 Select * from 表名 where 列名 like '%x%' //中間為x,左右都可以有任意位字元 注:x 支援替換為參數,例如 SELECT * FROM 銷量 where 銷售員 like '%${name}%' |
"_" | 表示單個字元 | SQLServer Oracle MySQL | Select * from 表名 where 列名 like '_x' //右為x,前面有一位字元 Select * from 表名 where 列名 like '__x' //右為x,前面有兩位字元 Select * from 表名 where 列名 like 'x__' //左為x,後面有兩位字元 |
"[]" | 表示括弧內所列字元中的一個 指定一個字元,字串或者範圍,要求所匹配物件是他們中的任意一個 注:如 [ ] 內有一系列字元( 01234、abcde 之類的)則可略寫為“0-4”、“a-e” | SQLServer | Select * from 表名 where 列名 like '[張李王]三' //將找出“張三”,“李三”,“王三”(而不是“張李王三”) Select * from 表名 where 列名 like '老[1-9]' //將找出“老1”,“老2”,……,“老9” |
Oracle | select * from 表名 where regexp_like(列名,'[張李王]三') //將找出“張三”,“李三”,“王三”(而不是“張李王三”) | ||
MySQL | select * from 表名 where 列名 rlike '[張李王]三' //將找出“張三”,“李三”,“王三”(而不是“張李王三”) select * from 表名 where 列名 regexp '[張李王]三' //將找出“張三”,“李三”,“王三”(而不是“張李王三”) | ||
"[^]" | 表示不在括弧列中的單個字元 其取值與[]相同,但它要求所匹配物件為指定字元以外的任一字元 | SQLServer | Select * from 表名 where 列名 like '[^張李王]三' //將找出不姓“張”,“李”,“王”的“趙三”,“孫三”等 Select * from 表名 where 列名 like '老[^1-4]' //將排除“老1”到“老4”,尋找“老5”,“老6”、…… |
Oracle | select * from 表名 where regexp_like(列名,'[^李王]三') //將找出不姓“李”,“王”的“趙三”,“孫三”等 | ||
MySQL | select * from 表名 where 列名 rlike '[^李王]三' //將找出不姓“李”,“王”的“趙三”,“孫三”等 select * from 表名 where 列名 regexp '[^李王]三' //將找出不姓“李”,“王”的“趙三”,“孫三”等 | ||
特殊字元模糊查詢 | 當要查詢的字串包含萬用字元的時候,可以採用下面的方法來查詢 | SQLServer | 用[ ]將特殊字元包含: select * from 表名 where 列名 like '_[%]_' |
Oracle | 用 escape 關鍵字將特殊字元轉義: select * from 表名 where 列名 like '_\%_' escape '\' | ||
MySQL | 用\將特殊字元轉義: select * from 表名 where 列名 like '_\%_' |
注:Access 的模糊查詢是 '?','*' ,如 :Select * from 表名 where 列名 like '*b*'
2.1.2 綁定過濾元件
2.1.1 節中已經定義好了資料集參數,如果要實現查詢就必須綁定一個元件。點選參數面板,在參數面板「組件設定」處可以看到定義的 name 參數,點選將其新增在參數面板中,根據需要選擇一個元件型別,這裡我們選擇「文字元件」。如下圖所示:
2.1.3 設計報表實現過濾
將 ds1 資料集的資料列拖到報表中,設計報表,如下圖所示:
2.1.4 效果預覽
保存範本,點選「分頁預覽」,在文字框中輸入模糊查詢的字串,也就對應著 name 參數為不同的值,則資料庫 SQL 語句就不同,這樣就實現了模糊查詢。PC 端效果如下圖所示:
App 及 HTML5 效果如下圖所示:
點選下載範本:模糊查詢簡單範例.cpt
2.2 範本參數
範本參數 實現資料篩選查詢和資料集參數不同,資料集參數是在從資料庫中查詢資料時就實現了過濾,而範本參數是將資料列新增在儲存格中後再過濾,適合內建資料集或者檔案資料集使用。
2.2.1 定義範本參數
這裡相當於提前定義好一個參數,參數可以是 範本參數、全局參數、系統參數。區別在於全局參數所有範本都可以用,系統參數不用再定義。若你定義了一個全局參數想要實現過濾,或者想要透過系統參數過濾,也可以參考此方法。
定義一個範本參數 name。如下圖所示:
2.2.2 綁定過濾元件
2.2.1 節中已經定義好了範本參數,如果要實現查詢就必須綁定一個元件。點選參數面板,在參數面板「組件設定」處可以看到定義的 name 參數,點選將其新增在參數面板中,根據需要選擇一個元件型別,這裡我們選擇「文字元件」。如下圖所示:
2.2.3 新增過濾條件
建立資料集,SQL 語句為:SELECT * FROM 銷量,即預設查詢銷量表中所有資料。將資料列新增到儲存格中,並設定報表樣式,如下圖所示:
這時預設是所有資料,如果要實現查詢,就必須新增過濾條件,雙擊 A2 儲存格,為其新增過濾條件。過濾條件為銷售員這一列的值包含參數 name。如下圖所示:
這樣就實現了過濾,保存範本,點選「分頁預覽」,在文字框中輸入模糊查詢的字串,也就對應著 name 參數為不同的值,則報表過濾條件不同,查詢出的資料也就不同,這樣就實現了資料模糊查詢。如下圖所示:
2.2.4 效果預覽
保存範本,效果如 2.1.4 節所示。
3. 索引
參考文檔 | 應用場景 | 效果圖 |
在對報表進行模糊查詢的時候,希望查詢出來的資料列中,高亮顯示模糊關鍵字。 | ![]() | |
希望使用下拉複選框選擇多個值,按照每個值去模糊查詢 | ![]() |