在 Oracle 中允许来自 SSRS 的多个值

Allow multiple values from SSRS in oracle

我有一个获取 contract_types 1 到 10 的查询。此查询在 SSRS 报告中用于筛选出更大的数据集。我对空值使用 -1,对所有值使用 -2。

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

我获取 ContractTypes 的查询:

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

哪个return

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

目前只有 return 单个值或所有值,而不是多个值:

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 

在我的报告中,我希望能够 select contract_type as -1(null),0,1 使用 'allow muliple values' 复选框。目前,我只能select 'all' 使用我的 -2 值,或单一合约类型。

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

我的输出是 Bill、Bob、Joe。

这就是我执行代码的方式

我不知道 SSRS,但是 - 如果我理解正确的话,您必须将 comma-separated 值列表分成几行。类似于此示例:

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
                                )

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

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

输入:1,2,3,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

输出:

我经常将 SSRS 与 Oracle 结合使用,所以我知道您来自哪里。值得庆幸的是,他们合作得很好。

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

的友好描述

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

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

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


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

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

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

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

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

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