t检查是否在多值参数(在 SQL 数据集中)选择了逗号分隔列表中的任何值



我的SQL数据集中有一个字段,其中包含一个逗号分隔的2-4个字母代码列表 - 我们称之为CodeField。我还有一个多值报表参数,其可用值是完整的可能代码集 - CodeParam。 基本上,在我的SQL查询中,我需要包含一个WHERE条件,其中包括在CodeParam中选择CodeField中的任何代码的行。

我最初的方法是生成以下形式的条件(通过自定义代码或 SSRS 表达式中的 JOIN):([CodeField] LIKE '%AA%') OR ([CodeField] LIKE '%BB%') OR ..(其中 AA、BB、.. 是在 CodeParam 中选择的值),然后根据此答案将其作为动态 SQL 包含在内。

然而,那里的评论表明,动态生成的SQL通常是错误的处理方式,并且可能有更好的方法。

那么,解决这个问题的最佳方法是什么? 不过分关心查询的性能;我主要在寻找最简单/最干净有效的解决方案。

因此,由于这个确切的原因,我肯定会提到拥有包含多个数据点的列往往并不理想。

无论如何,我可以建议做的是以下内容:

  1. 我们为每个唯一的多值列分配一个 RowId。
  2. 我们按分隔符拆分列(我用了 https://stackoverflow.com/a/28153222/1470896,但有更好的方法可以通过存储过程做到这一点)。
  3. 我们使用 IN 进行匹配,并保持匹配的不同 RowId
  4. 我们通过匹配的 RowId 过滤原始结果集

下面是一个示例

IF OBJECT_ID('tempdb..#Temp') IS NOT NULL DROP TABLE #Temp
SELECT
*
, ROW_NUMBER() OVER (ORDER BY NEWID()) AS RowId
INTO #Temp
FROM (VALUES ('abc,def,ghi,jkl'), ('mno,pqr,stu,vwx')) AS MyTable(MyColumn);
WITH StringSplitWithRowId AS (
SELECT
RowId
, LTRIM(RTRIM(Split.a.value('.', 'VARCHAR(100)'))) 'Value'
FROM (
SELECT
RowId
, CAST('<M>' + REPLACE( MyColumn, ',', '</M><M>') + '</M>' AS XML) AS Data
FROM #Temp
) a
CROSS APPLY Data.nodes ('/M') AS Split(a)
),
RowIdsToInclude AS (
SELECT DISTINCT
RowId
FROM StringSplitWithRowId
WHERE Value IN (@SsrsReportParameter) -- query will not work in ssms, needs to be run in RS
)
SELECT
*
FROM #Temp t
INNER JOIN RowIdsToInclude i
ON t.RowId = i.RowId

相关内容

  • 没有找到相关文章