反饋已提交

網絡繁忙

SQL函式

1. 概述

1.1 版本

報表伺服器版本功能變更
11.0-
11.0.18新增防 SQL 注入書寫方式,對安全問題需求較高可採用新寫法,原寫法仍可用

1.2 函式作用

資料集函式 能夠從資料集中直接進行條件取數,但是有的時候使用者希望某個儲存格能夠直接獲取到資料庫中的某個值,而不是先要定義一個資料集後,再去取資料。

這時就可以用 SQL 函式。

1.3 函式解譯

文法SQL(connectionName,sql,columnIndex,rowIndex)傳回的資料是從 connectionName 資料庫中獲取的 SQL 語句的表中的第 columnIndex 列第 rowIndex 行所對應的元素。
參數1connectionName資料連結名稱,字串形式,需要用引號如"FRDemo";
參數2sqlSQL語句,字串形式
參數3columnIndex列序號,整數型態;
參數4rowIndex行序號,整數型態。

注:行序號可以省略,這樣傳回值為資料列。

1.4 注意事項

僅支援執行select查詢語句,不支援執行insert、delete、update等增刪改語句。

2. 取資料庫中不帶參數的指定內容

範例資料:內建資料庫 FRDemoTW 中的 STSCORE 資料表。

從內建資料庫「FRDemoTW」裏的 STSCORE 表取第三行第三列資料值。

從表 STSCORE 中,可看到第 3 行第 3 列的值為 Alex,如下圖所示:

現在若要直接在報表的儲存格中顯示資料值:Alex,而不是透過先定義一個資料集後,再去取資料的方式,使用 sql() 公式,此時只需在儲存格中輸入:=sql("FRDemoTW","SELECT * FROM STSCORE",3,3)即可,預覽就可看到 Alex 值,如下圖所示:

3. 取資料庫中帶有參數的指定內容

範例資料:內建資料庫 FRDemoTW 中的 STSCORE 資料表。

3.1 SQL 參數為普通參數

需要取出班級為 Class1 的第 3 列所有值。

在儲存格中輸入:=sql("FRDemoTW","SELECT * FROM STSCORE where CLASSNO = 'Class1' ",3),顯示效果(班級為 Class1 的第 3 列所有值),如下圖所示:

公式說明:

公式說明
"FRDemoTW"資料連結名
"SELECT * FROM STSCORE where CLASSNO = 'Class1' "SQL 語句;查詢 CLASSNO 為 Class1 的資料
3列序號,第三列的資料

若需要顯示某個具體值,如顯示 Jonny (即班級為 Class1 的第 3 列第 4 行的值),寫法如下:

=sql("FRDemoTW","SELECT * FROM STSCORE where CLASSNO = 'Class1' ",3,4)

3.2 SQL 參數為變數

注:不支援引用資料參數。

若參數值為變數如為報表參數或者是某個儲存格,則寫法如下:

11.0.18及之後版本支援較安全的SQL防注入寫法:

=sql("FRDemo","SELECT * FROM STSCORE where CLASSNO = '${class}' ",3,4) 

所有版本支援:

=sql("FRDemo","SELECT * FROM STSCORE where CLASSNO = '"+$class+"' ",3,4) 

=sql("FRDemo","SELECT * FROM STSCORE where CLASSNO = '"+A1+"' ",3,4)

例如希望過濾元件選擇不同班級,顯示不同班級下所有的同學的名稱。

首先設定 範本參數「class」,然後在儲存格中輸入公式:=sql("FRDemoTW","SELECT * FROM STSCORE where CLASSNO = '${class}' ",3),如下圖所示:

顯示效果如下圖所示:

2023-08-02_12-05-56.gif

如果傳遞的參數是獲取當前儲存格的值,即用 $$$ 作為參數時,字串類型同樣需要連結單引號,例如:

11.0.18及之後版本支援較安全的SQL防注入寫法:

=sql("FRDemo","SELECT * FROM STSCORE where CLASSNO = '${$$$}' ",3,4)

所有版本支援:

=sql("FRDemo","SELECT * FROM STSCORE where CLASSNO = '"+$$$+"' ",3,4)

注1:如果參數或者儲存格值有多個,那麼 SQL 函式的寫法如下:=sql("FRDemoTW","SELECT * FROM STSCORE where CLASSNO in ('${class}') and COURSE  in ('${COURSE}') ",3,4)"

注2:class 參數傳回值的分隔符需為',',具體請查看SQL語句實現下拉框參數聯動

3.3 SQL 參數為變數且需要連結

在 SQL 中還可以使用 IF 函式進行判斷並連結範本參數,例如希望實現當參數 class 為空時,選擇全部學生姓名,可輸入公式:

=sql("FRDemoTW","SELECT * FROM STSCORE where 1=1 "+if(len(class)== 0,"","and CLASSNO = '${class}'"),3) 

公式說明:

公式說明
"SELECT * FROM STSCORE where 1=1 "將 SQL 語句兩邊加上引號作為字串
+if(len(class)== 0,"","and CLASSNO = '${class}'"

這裏的+是指字串連結符號

將前面的 SQL 語句透過+進行連結

當參數「class」為空,查詢語句相當於:SELECT * FROM STSCORE 

當參數「class」不為空時,查詢語句相當於:

SELECT * FROM STSCORE  WHERE 1=1 and CLASSNO ='"+$class+"' 

sql("FRDemoTW","SELECT * FROM STSCORE where 1=1 "+if(len(class)== 0,"","and CLASSNO = '${class}'"),3) 

當參數「class」為空,相當於:sql("FRDemoTW","SELECT * FROM STSCORE",3) 

當參數「class」不為空時,查詢語句相當於:sql("FRDemoTW","SELECT * FROM STSCORE  WHERE 1=1 and CLASSNO ='${class}'",3)

如果在 SQL 中參數為模糊查詢時,可使用如下公式:

11.0.18及之後版本支援較安全的SQL防注入寫法:

=sql("FRDemo","SELECT * FROM STSCORE where CLASSNO like '%${class}%' ",3,4)

所有版本支援:

=sql("FRDemo","SELECT * FROM STSCORE where CLASSNO like '%"+$class+"%' ",3,4)

附件列表


主題: 報表專題
  • 有幫助
  • 沒幫助
  • 只是瀏覽
  • 圖片不清晰
  • 用語看不懂
  • 功能說明看不懂
  • 操作說明太簡單
  • 內容有錯誤
中文(繁體)

滑鼠選中內容,快速回饋問題

滑鼠選中存在疑惑的內容,即可快速回饋問題,我們將會跟進處理。

不再提示

10s後關閉

獲取幫助
線上支援
獲取專業技術支援,快速幫助您解決問題
工作日9:00-12:00,13:30-17:30在线
頁面反饋
針對當前網頁的建議、問題反饋
售前咨詢
業務咨詢
電話:0933-790886或 0989-092892
郵箱:taiwan@fanruan.com
頁面反饋
*問題分類
不能為空
問題描述
0/1000
不能為空

反馈已提交

网络繁忙