问题描述
我正在使用 Microsoft SSRS (2012) 构建报告,该报告具有多值参数 @parCode
,供用户过滤某些代码。这工作得很好。通常,我的查询如下所示:
SELECT ...
FROM ...
WHERE
TblCode.Code IN (@Code)
ORDER BY...
代码类型如下(只是摘录):
C73.0
C73.1
...
C79.0
C79.1
C79.2
现在,除了过滤多个这些代码之外,我还希望能够过滤代码的子字符串。意思是,当用户输入时(例 1)
C79
对于 @parCodes
输出应该是
C79.0
C79.1
C79.2
所以最终用户应该能够进入(示例 2)
C73.0
C79
对于@parCodes
,输出为
C73.0
C79.0
C79.1
C79.2
我设法分别实现了这两种功能,因此要么过滤多个“完整”代码,要么过滤代码子字符串,但不能同时实现。
我尝试做类似的事情
...
WHERE
TblCode.Code IN (@parCode +'%')
ORDER BY...
但这搞砸了示例 2。另一方面,如果我尝试使用 LIKE
或 =
而不是 IN
语句,那么我将无法使参数多值。
有谁知道如何实现这样的功能,或者与多值参数配对的 IN 语句是否根本不允许这样做?
非常感谢!
解决方法
假设您使用的是 SQL 服务器
WHERE (
TblCode.Code IN (@parCode)
OR
CASE
WHEN CHARINDEX('.',Code)>0 THEN LEFT(TblCode.Code,CHARINDEX('.',TblCode.Code)-1)
ELSE TblCode.Code
END IN (@parCode)
)
第一个子句进行完全匹配,因此对于您的示例匹配 C73.0 第二个子句匹配点字符之前的字符,因此它会得到值 C79.0、C79.1、C79.2 等
警告:使用表达式进行过滤会使 TblCode.Code 上的索引的使用无效