使用 SQL 通过多值参数查询完整字符串和子字符串

问题描述

我正在使用 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 上的索引的使用无效