首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >检查多值参数(在SQL数据集中)中是否选择了逗号分隔列表中的任何值。

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

Stack Overflow用户
提问于 2019-04-25 14:04:47
回答 1查看 120关注 0票数 1

我的separated中有一个字段,其中包含一个以逗号分隔的短2-4字母代码列表--让我们将其命名为CodeField。我还有一个多值报表参数,它的可用值是一组可能的代码- CodeParam。基本上,在我的SQL查询中,我需要包含一个WHERE条件,该条件包括在CodeField中的任何代码都在CodeParam中被选中的行。

我最初的方法是生成以下形式的条件(通过自定义代码或SSRS表达式中的联接):([CodeField] LIKE '%AA%') OR ([CodeField] LIKE '%BB%') OR .. (其中AA,BB,.是在CodeParam中选择的值,然后按照this answer包含它作为动态SQL。

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

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-04-25 15:07:28

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

无论如何,我建议做的事情如下:

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

下面是一个例子

代码语言:javascript
复制
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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55851198

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档