【问题标题】:How to replace where clause dynamically in query (BIRT)?如何在查询(BIRT)中动态替换where子句?
【发布时间】:2016-02-19 06:14:33
【问题描述】:

在我的报告查询中,我有一个 where 子句需要根据前端选择的数据动态替换。

查询类似于:

哪里?=?

我已经有一个替换值的代码 - 我创建了报告参数并链接到该值?在查询中。

示例: 其中名称=?

任何来自前端的 name 值都会替换 ?在 where 子句中 - 这很好用。

但现在我需要替换整个子句(where ?=?)。我应该创建两个参数并将它们链接到两个“?” ?

【问题讨论】:

    标签: sql where-clause birt


    【解决方案1】:

    不,遗憾的是大多数数据库引擎不允许使用查询参数来处理动态列名。这是出于安全考虑。

    所以你需要在查询中保留一个任意的列名:

    where name=?
    

    然后在数据集的“beforeOpen”脚本中将“名称”替换为报告参数值:

    this.queryText=this.queryText.replace("name",params["myparameter"].value);
    

    为了防止 SQLIA,我建议在此脚本中测试参数的值。有很多方法可以做到这一点,但白名单是最强的测试,例如:

    var column=params["myparameter"].value;
    if (column=="name" || column=="id" || column=="account" || column=="mycolumnname"){
      this.queryText=this.queryText.replace("name",column);
    }
    

    【讨论】:

    • 在我的报告中,输入参数的数量是不固定的,因为 where 子句可能只有名称或名称和代码,甚至根本没有 where 子句。我必须根据来自前端的参数动态更改查询。
    【解决方案2】:

    除了 Dominique 的回答和您的评论之外,您只需要稍微高级一点的逻辑即可。 例如,您可以将动态列-名称-值对命名为 (column1, value1)、(column2, value2) 等等。在查询的静态文本中,确保有 value1、value2 等的绑定变量(例如,对于 Oracle SQL,使用语法

    with params as (
      select :value1 as value1,
             :value2 as value2 ... 
      from dual
    )
    select ... 
    from params, my_table 
    where 1=1 
    and ... static conditions....
    

    然后,在 beforeOpen 脚本中,根据需要将条件附加到循环中的查询文本(循环留给读者作为练习,出于安全原因不要忘记检查列名!):

    this.queryText += " and " + column_name[i] + "= params.value" + i;
    

    这样您仍然可以使用绑定变量作为比较值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-08
      • 2010-09-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多