在 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 作为 Value
和 Label
.
的友好描述
接下来,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 + ',%'
显然,这效率较低,因为它很可能不会使用索引,但它确实有效。
我有一个获取 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 作为 Value
和 Label
.
接下来,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 + ',%'
显然,这效率较低,因为它很可能不会使用索引,但它确实有效。