参数编写方法

使用场景 #

  • 需要使用图表联动效果
  • 数据服务接口开发

使用魔法方法(smartchart独创,拒绝抄袭) #

基础原理 #

 1. $参数名 : 当有传递参数时将替换相关的值
 2. /* ... $参数名 ... */ : 当参数写在这个区间时, 如果外部没有传入参数, 会自动忽略这一段代码
 3. -- : 标识之后单行的代码会被忽略

常见组合应用 #

理解以下样列后, 可录活使用组合出各种可能的需求

  • 常规用法
select xx from table_name where calmonth = '$month'
  • 默认参数: 实现在不传参数时默认参数是当前月份
select xx from tablename where
calmonth =/*'$calmonth' -- */ to_char(sysdate,'YYYYMM')

假设没有传递参数, 那么/* .. */将会消失, 即真正的查询是:
select xx from tablename where
calmonth = to_char(sysdate,'YYYYMM')
假设有传递参数, 比如calmonth=202305, /* .. */打开, 查询会是这样
select xx from tablename where
calmonth = '202305' -- to_char(sysdate,'YYYYMM')
由于"--" 会忽略掉之后整行的代码, 所以真正的查询就是
select xx from tablename where
calmonth = '202305'
  • 多个参数: 注意使用1=1及and的位置
select xx from tablename where 1=1 /* and city = '$city' */ 
/* and calmonth ='$calmonth'*/
  • 维度变化: 将字段当成参数
select /*$calmonth,*/ city, count(1) as qty from tablename 
group by /*$calmonth,*/ city
  • 维度变化: 当传入月份条件时, 按城市,月份的数据, 不传参数时只看按城市的总数
select /*月份, -- $Month */  
城市, sum(度量) from tablename
where 1=1
/* and 月份 > '$Month' */
group by 城市  
/*,月份 -- $Month*/

高级开关应用 #

以上应用可以通过参数是否有传递,来实现开关代码段的效果, 有些场景可能还希望通过参数值来进行代码段的开关 如下代码可以实现当传递参数type=1 或 type=2 时执行不同的代码段 使用 “$参数__值” 的方式做为开关

/* select count(1) as qty from tablename1  -- $type__1*/
/* select count(1) as qty from tablename2  -- $type__2*/

再比如 当参数D传值为"月份"时是统计2022年按月的统计, 传"日期"时统计的是2022年10月按天的统计

select $D, count(1) as qty from tablename
where 1 = 1
/* and year='2022'    -- $D__日期  $D__月份 */
/* and month='10'     -- $D__日期 */
group by
$D

加了"–“是为了避免语法错误

数据集开发调试参数方法 #

对于开发人员来说, 带参数的SQL调试不方便, 所以支持你在sql中写入默认参数 方法如下格式, 你可以在sql编辑器的最上方写上 /* {xxxxxx} */, 会默认在开发调试模式下取这些参数, 在用户模式下会忽略

/* {"月份":"202009","城市":"中山"} */
select xxx from table xxx

数据权限行级别控制 #

  • 当你在sql查询中加上’$username’, 会自动替换成登录用户的用户名
  • 如果你是嵌入到第三方系统, 你可以通过url传递参数id, 在后台会转化为参数_id, 在sql中配置$_id即可控制数据权限
  • 可以采用此做数据权限关联后台权限mapping表进行数据权限控制实现不同人看不同的数据

参数的传递方式 #

  • 你可以从url传入参数, 在url上加入 &param={“参数名”:“参数值”}
  • 在图形联动的点击过程中会自动传递参数, 具体参考联动相关文档

TIPS 当设定参数后, 联动过程dataset的缓存功能失效, 所以不要让带参数的查询设计得太慢 参数如果存在一些非法字符可能会有问题, 比如参数中不可以有#号