【问题标题】:Allow multiple values from SSRS in oracle在 oracle 中允许来自 SSRS 的多个值
【发布时间】:2020-09-12 06:15:47
【问题描述】:

我有一个查询,它的 contract_types 为 1 到 10。此查询在 SSRS 报告中用于过滤出更大的数据集。我使用 -1 表示空值,使用 -2 表示所有值。

我想知道我们如何允许多个值 - oracle 是否将输入连接在一起以便传入“1,2,3”?假设我们在 SSRS 中选择 -1,0,1,我们如何更改底部查询以返回值?

我获取 ContractTypes 的查询:

SELECT
       ContractType, 
       CASE WHEN  ContractType = -2 THEN 'All'
            WHEN ContractType = -1 THEN'Null'
            ELSE to_Char(ContractType)  
            END AS DisplayFigure
FROM ContractTypes 

返回

ContractType DisplayFig
-1           Null
0            0
1            1
2            2
3            3
4            4
5            5
6            6
7            7 
8            8
9            9
10           10

这目前只返回单个值或全部,而不是多个值:

SELECT *
FROM Employee
WHERE NVL(CONTRACT_TYPE, -1) = :contract_type or :contract_type = -2

我假设我们想做这样的事情:

WHERE NVL(CONTRACT_TYPE, -1) IN (:contract_type) 

但这似乎不起作用。

员工数据

Name ContractType
Bob  1
Sue  0
Bill Null
Joe  2 

在我的报告中,我希望能够使用“允许多个值”复选框将 contract_type 选择为 -1(null),0,1。目前,我只能使用我的 -2 值选择“全部”或单一合同类型。

我的输入是:合约类型 = -1,1,2

我的输出将是 Bill、Bob、Joe。

这就是我执行代码的方式

【问题讨论】:

  • 所问的内容需要更清楚。我不明白你的输入是什么,输出到底是什么。请包含示例数据并说明您希望将其作为输入的输出看到什么。
  • 好的,绑定变量的数据类型是什么,即 :ContractType ?我提供的代码期望它是 varchar2。
  • 在 SSRS 中它是一个文本字段,在 pl/sql developer 中它是一个字符串
  • 我不确定 SSRS。我从来没有在这方面工作过。如果它是一个字符串,那么我的代码应该可以工作。请复制并粘贴我的代码并在 SQL Developer 上运行它。然后提供不同的输入,你会看到它会起作用。

标签: oracle reporting-services ssrs-2008


【解决方案1】:

我经常将 SSRS 与 Oracle 一起使用,所以我知道您来自哪里。谢天谢地,他们一起工作得很好。

首先确保参数设置为允许多个值。这会在您的下拉列表中添加一个Select All 选项,因此您不必担心为“全部”添加特殊情况。您需要确保参数的数据集有一行 -1 作为Value 和对Label 的友好描述。

接下来,WHERE 子句就像你提到的那样:

WHERE NVL(CONTRACT_TYPE, -1) IN (:contract_type) 

SSRS 会自动填充这些值。不需要 XML 或字符串操作。请记住,这不适用于单值参数。


如果由于某种原因这仍然无法在您的环境中按预期工作,您可以使用另一种解决方法,它更通用,甚至适用于 ODBC 连接。

在数据集参数属性中,使用这样的表达式将值连接成一个逗号分隔的字符串:

="," + Join(Parameters!Parameter.Value, ",") + ","

然后在WHERE 子句中使用这样的表达式:

where :parameter like '%,' + Column + ',%'

显然,这效率较低,因为它很可能不会使用索引,但它确实有效。

【讨论】:

  • 谢谢,这对我有用。我在我的 pl/sql 开发人员中也有点白痴,因为我没有选择替换作为数据类型!
【解决方案2】:

我不知道 SSRS,但是 - 如果我理解正确,您必须将该逗号分隔值列表拆分为行。类似这个例子:

SQL> select *
  2  from dept
  3  where deptno in (select regexp_substr('&&contract_type', '[^,]+', 1, level)
  4                   from dual
  5                   connect by level <= regexp_count('&&contract_type', ',') + 1
  6                  );
Enter value for contract_type: 10,20,40

    DEPTNO DNAME                LOC
---------- -------------------- --------------------
        20 RESEARCH             DALLAS
        10 ACCOUNTING           NEW YORK
        40 OPERATIONS           BOSTON

SQL>

应用于您的代码:

select *
from employee
where nvl(contract_type, -1) in (select regexp_substr(:contract_type, '[^,]+', 1, level)
                                 from dual
                                 connect by level <= regexp_substr(:contract_type, ',') + 1
                                )

【讨论】:

  • 您好,感谢您的回复-当我执行 oracle 测试脚本时,我得到“无效号码”。 contract_type 是一个字符串,我传入 -1,1,2
  • 这通常意味着您正在将字符串与数字进行比较,但这是行不通的。也许 TO_CHAR 或 TO_NUMBER 有帮助。
【解决方案3】:

如果您有逗号分隔的数字列表,然后如果您想拆分它,那么下面的内容看起来简单且易于维护。

select to_number(column_value) from xmltable(:val);

输入:1,2,3,4

输出:

【讨论】:

  • 谢谢,我不确定 SSRS 如何将多个值传递给 oracle。我会假设它的逗号是分开的
【解决方案4】:

我想我理解你的问题。如果我是正确的,以下应该可以解决您的问题:

with inputs(Name, ContractType) as
(
    select 'Bob',  1 from dual union all
    select 'Sue',  0 from dual union all
    select 'Bill', Null from dual union all
    select 'Joe',  2  from dual 
)
select  * 
from    inputs
where   decode(:ContractType,'-2',-2,nvl(ContractType,-1)) in (select to_number(column_value) from xmltable(:ContractType))

输入:-1,1,2

输出:

输入:-2

输出:

【讨论】:

  • 不幸的是,这对我不起作用,我没有返回任何行,我不知道为什么
  • 我确实得到了结果,但是 WHERE NVL(CONTRACT_TYPE, -1) LIKE :contract_type 或 :contract_type = -2
  • 我在 SQLDeveloper 上尝试过,它确实对我有用。如果您说它对您不起作用,那么您是如何运行它的?而如果你放“:”,则表示它是一个varchar2类型的绑定变量。这意味着它充当一个字符串。请发布您如何运行我的代码。
  • 所以我在测试 oracle 脚本中运行 - 我会附上截图 - 谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-06-04
  • 1970-01-01
  • 2016-09-10
  • 2018-11-30
  • 1970-01-01
  • 2020-12-29
  • 1970-01-01
相关资源
最近更新 更多