溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

大數(shù)據(jù)報表查詢條件的使用方式有哪些

發(fā)布時間:2022-01-15 15:54:24 來源:億速云 閱讀:209 作者:柒染 欄目:大數(shù)據(jù)

大數(shù)據(jù)報表查詢條件的使用方式有哪些,很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細(xì)講解,有這方面需求的人可以來學(xué)習(xí)下,希望你能有所收獲。

眾所周知,大拿們在設(shè)計報表的時候,需要展現(xiàn)的數(shù)據(jù)很少是固定不變地,經(jīng)常需要使用查詢條件過濾出我們想要的數(shù)據(jù)。簡而言之就是,同一張報表可以在不同的參數(shù)控制下呈現(xiàn)出不同的數(shù)據(jù)。

那么問題來了,報表工具一般都用哪些方法來實(shí)現(xiàn)這一需求呢?

使用SQL參數(shù)

首先當(dāng)然必須是說 SQL, 正常情況下不同的過濾條件會對應(yīng)著取數(shù) SQL 中不同的 WHERE 條件,而報表工具能將報表參數(shù)對應(yīng)成 SQL 的參數(shù),這樣一來,輸入不同報表參數(shù)時就會產(chǎn)生不同的 SQL。

假如我們要做一個有查詢條件的報表,拿訂購日期作為檢索條件,查詢不同日期區(qū)間下訂單信息表中的數(shù)據(jù)。其中的數(shù)據(jù)列包括:訂單 ID, 客戶 ID, 訂購日期, 發(fā)貨日期, 運(yùn)貨商, 貨主名稱, 貨主地區(qū), 訂單金額。

Follow me,我們拿潤乾報表來做個例子,首先設(shè)置兩個參數(shù),取名為 startdate 與 enddate:

大數(shù)據(jù)報表查詢條件的使用方式有哪些

然后這個報表的取數(shù) SQL 要寫成含有參數(shù)的形式,SQL 語句中使用“?”(英文問號)表示參數(shù):

select 訂單 ID, 客戶 ID, 訂購日期, 發(fā)貨日期, 運(yùn)貨商, 貨主名稱, 貨主地區(qū), 訂單金額 from 訂單信息表 where 訂購日期 >? and 訂購日期 <?

然后要配置 SQL 參數(shù)與報表參數(shù)的對應(yīng),即將 SQL 語句中每個“?”翻譯成對應(yīng)的報表參數(shù)。

大數(shù)據(jù)報表查詢條件的使用方式有哪些

配置完成后用戶只需要通過設(shè)置不同的報表參數(shù),就可以獲取不同的數(shù)據(jù)了。例如查詢 2014 年 1 月 1 號到 2014 年 1 月 8 號之間的訂單信息,那么設(shè)置參數(shù) startdate 值為 2014-01-01,參數(shù) enddate 值為 2014-01-08,查詢結(jié)果如下:

大數(shù)據(jù)報表查詢條件的使用方式有哪些

空值參數(shù)

有時候我們希望某個參數(shù)不輸入時報表可以聰明地理解為忽略該參數(shù),比如上例中沒有輸入 enddate 時報表可以默默地查出從某個起始日期之后的所有訂單。那需要怎么做呢?

這種情況下可以把沒有輸入的參數(shù)認(rèn)為是取值為空的參數(shù),我們只需要修改一下上面的 SQL 語句,增加對空值的判斷即可:

select 訂單 ID, 客戶 ID, 訂購日期, 發(fā)貨日期, 運(yùn)貨商, 貨主名稱, 貨主地區(qū), 訂單金額 from 訂單信息表 where (? is null or 訂購日期 >?) and (? is null or 訂購日期 <?)

這樣,當(dāng)參數(shù)值為空時就相當(dāng)于被忽略了。

相應(yīng)地,SQL 參數(shù)與報表參數(shù)的對應(yīng)也要修改,這兩個參數(shù)在 SQL 中分別使用了兩次,各自對應(yīng)了兩個問號:

大數(shù)據(jù)報表查詢條件的使用方式有哪些

這時候要查詢 2015 年 1 月 1 號之后、結(jié)束日期不限制的數(shù)據(jù),將參數(shù) startdate 設(shè)置為 2015-01-01,參數(shù) enddate 為 null 就可以了,

查詢結(jié)果如下:

大數(shù)據(jù)報表查詢條件的使用方式有哪些

使用宏表達(dá)式

從上例可以看到,使用參數(shù)時要事先知道取數(shù) SQL 中哪些字段可作為查詢條件。但有時候可用于做查詢條件的字段非常多,比如針對一個訂貨信息表來說,還可能按客戶 ID、按地區(qū)、按運(yùn)貨商等各種條件查詢。如果使用上述參數(shù)的方式,就需要設(shè)置很多的參數(shù),取數(shù) SQL 語句也很長,使用和維護(hù)都比較麻煩。如果實(shí)現(xiàn)按任意字段查詢的話,無疑會方便許多。

有些報表工具提供了宏表達(dá)式,可以更靈活地解決這個問題。仍然以潤乾報表為例說明:

首先在報表中定義一個字符串參數(shù),比如名稱為 search。然后在取數(shù) SQL 中使用宏表達(dá)式引用這個參數(shù):

select 訂單 ID, 客戶 ID, 訂購日期, 發(fā)貨日期, 運(yùn)貨商, 貨主名稱, 貨主地區(qū), 訂單金額 from 訂單信息表 where ${search}

其中 ${search} 的意思就是會將 search 的內(nèi)容拼接到 SQL 的相應(yīng)位置得到一句可執(zhí)行的 SQL 語句。這種寫法即稱為宏表達(dá)式(下面討論時就簡稱宏)。

現(xiàn)在給報表傳遞不同的參數(shù)值就可以得到不同的數(shù)據(jù)了。例如要查詢訂單日期為 2014 年 1 月 1 號到 2014 年 1 月 8 號且貨主地區(qū)為華北的訂單信息,那么設(shè)置 search 的值為:

訂購日期 >’2014-01-01′ and 訂購日期 <‘2014-01-08′ and 貨主地區(qū) =’華北’

查詢結(jié)果如下:

大數(shù)據(jù)報表查詢條件的使用方式有哪些

從上可以看出利用宏可以在報表中輕易替換 SQL 語句的部分甚至全部,不同參數(shù)值,在報表中可以計算出不同的表達(dá)式結(jié)果,從而得到不同的報表信息,這樣面對大量不同類型的報表,用戶再也不用每次都做單獨(dú)的設(shè)計和維護(hù)了,大大減輕了工作量,釋放了勞動力。

參數(shù)與宏的對比

既然利用宏可以在報表中動態(tài)替換 SQL 語句的部分甚至全部,而且顯然使用宏比 SQL 參數(shù)更靈活,另外參數(shù)能做到的事情用宏都能做到,那么報表工具還有必要提供 SQL 參數(shù)機(jī)制嗎?是不是只要有宏就夠了?

事實(shí)上并沒有這么簡單。宏只是簡單地替換 SQL 語句的部分,要保證最后的語句合法,有時在生成參數(shù)字符串會有麻煩。數(shù)值等簡單數(shù)據(jù)類型可以直接拼進(jìn) SQL,而字符串常數(shù)就需要加上引號才可以,萬一這個常數(shù)中本身已經(jīng)有引號,則還需要先進(jìn)行轉(zhuǎn)義動作,而不同數(shù)據(jù)庫的規(guī)則又并不完全一樣,這就會影響報表的兼容性。

日期類型參數(shù)是最常出現(xiàn)這種麻煩的情況,例如查詢訂購日期為 2014-12-01 號的訂單信息,如果使用 Oracle 數(shù)據(jù)庫,那么宏值寫法是:

訂購日期 =TO_DATE(‘2014-12-01′,’yyyy-mm-dd’)

如果使用 Mysql 數(shù)據(jù)庫,那么宏值寫法為:

訂購日期 = DATE_FORMAT(‘2014-12-01′,’yyyy-mm-dd’)

使用 SQL 參數(shù)就沒有這個問題,數(shù)據(jù)庫接口能直接識別各種數(shù)據(jù)類型的參數(shù), 直接傳入?yún)?shù)值即可,沒必要再做這種拼串動作,也就不存在兼容性的問題了。

宏的SQL植入風(fēng)險

使用宏還存在安全風(fēng)險,WEB 中使用報表時,參數(shù)可能是網(wǎng)頁生成并傳到后臺的,而網(wǎng)頁有可能是被黑客攻擊改寫的,那么就有可能將惡意的參數(shù)值傳到后臺拼入 SQL 語句,欺騙服務(wù)器執(zhí)行惡意 SQL 命令。這就是我們常說的 SQL 植入風(fēng)險。

比如,在前面的宏表達(dá)式示例中,如果有人將 search 值改寫成:

1=1 UNION SELECT userid,password,null,… FROM user

那么就可能造成關(guān)鍵信息泄露。解決這個問題并不很簡單,把原始 SQL 改寫成這樣

select … where (${search})

看起來是可以擋住上面那種攻擊了,但仍然可以設(shè)計出新的植入串攻擊(讀者有興趣可以作為一個練習(xí)題來試試),要改成為這種很麻煩的樣子才行:

select…from…where(${search}) and ${search}

顯然,這種語句需要有強(qiáng)烈安全意識的老司機(jī)才能做到,而一般報表開發(fā)人員這方面相對會弱一些。所以宏不能亂用,能不用則不用。而使用 SQL 參數(shù)就沒有這個風(fēng)險,雖然參數(shù)沒有宏靈活,但顯然安全性對報表工具是必不可少的。個別報表工具為了省事只提供宏實(shí)現(xiàn)查詢條件,看起來是靈活了,但其實(shí)是相當(dāng)不負(fù)責(zé)任的做法,在選擇報表工具時一定要注意。

解決方案

以上面的業(yè)務(wù)場景為例,實(shí)現(xiàn)步驟如下:

1、制作有宏表達(dá)式的報表

在報表中定義一個宏命名為:search,數(shù)據(jù)集 SQL 為:

select 訂單 ID, 客戶 ID, 訂購日期, 發(fā)貨日期, 運(yùn)貨商, 貨主名稱, 貨主地區(qū), 訂單金額 from 訂單信息表 where ${search}

2、配置參數(shù)中的禁用單詞

在【安裝目錄】\esProc\config\raqsoftConfig.xml 文件中的 disallowedParamWordList 屬性里配置禁用字符串,配置多個字符串時使用逗號分隔,例如

<property name=”disallowedParamWordList” value=”union, user”/>

將會在參數(shù)中禁用“union”與“user”,即含有這些串的參數(shù)將被拒絕。

3、在 tag 標(biāo)簽上設(shè)置檢查

用 tag 標(biāo)簽 paramCheck 來控制報表是否要做此校驗,paramCheck=”yes”表示接受校驗,paramCheck=”no”表示不作校驗,不配置該標(biāo)簽時默認(rèn)為接受校驗。這樣,不是所有報表都一定會被檢查,有些可以確認(rèn)安全的報表就不必再檢查以獲得靈活性。

這些都完成后,在 web 端瀏覽報表時,用戶輸入的檢索條件會在報表參數(shù)校驗通過后才傳遞給報表,最終拼接到數(shù)據(jù)集 SQL 中,不合法的參數(shù)值將被拒絕,從而避免了上例中 SQL 植入的風(fēng)險。

看完上述內(nèi)容是否對您有幫助呢?如果還想對相關(guān)知識有進(jìn)一步的了解或閱讀更多相關(guān)文章,請關(guān)注億速云行業(yè)資訊頻道,感謝您對億速云的支持。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI