首页 > 解决方案 > 操作要在 IN 运算符(SQL、SSRS)中使用的字符串

问题描述

我有一个 SSRS 报告,其数据集的查询看起来像这样(简化为查询比这复杂得多):

select * 
from myTable 
where country in (@Country)

@Country是一个参数,可以有多个值

它工作正常,但我们被要求将所有值从一个国家汇总到另一个国家(该国家不在要选择的参数列表中)。

因此,例如,如果美国被选为国家之一,我们需要将属于加拿大的所有记录汇总到美国,基本上只是在返回的数据集中用“美国”替换“加拿大”,这很容易使用 REPLACE 甚至 CASE 实现陈述。但是,查询中的 WHERE 子句有点棘手。有谁知道如何用另一个字符串替换一个字符串,以便 IN 运算符理解?

如果我只是做这样的事情:

select * 
from myTable 
where country in (replace(@Country, 'US', 'US,Canada'))

查询不返回任何内容,我理解其背后的原因。

如果我测试这个硬编码的值是这样的:

select * 
from myTable 
where country in ('US', 'Canada')

它返回正确的数据行。我想我正在寻找一种方法来连接多个值,以便 IN 运算符正确理解它。

TIA,-TS。

标签: sql-serverreporting-serviceswhere-in

解决方案


您可以使用Dynamic SQL来实现这一点。您需要做的就是在第一行的声明中传递国家名称。

看下面的代码:

DECLARE @SQL NVARCHAR(2000), @Country VARCHAR(30) = 'Canada'

SELECT @SQL = CONCAT('
    select 
        * 
    from myTable 
    where country in (', 
    CASE WHEN @Country = 'US' THEN '''US'', ''Canada''' else '@Country' end , ')'
)

EXEC sp_executesql @SQL, N'@Country VARCHAR(30)', @Country = @Country

这是一个小提琴:http ://sqlfiddle.com/#!18/b7f49/4


推荐阅读