T-SQL(Azure),如何查看集合中是否有多个值

时间:2017-09-29 21:57:19

标签: sql-server azure tsql

我有一个列MyColumn,其值为“Value1,Value2”(使用for xml生成的串联字符串)。我还有一个表值参数@MyTVP,它可能包含值为“Value2”(或多个值)的行。 SQL的功能类似于:

where MyColumn in (select col from @MyTVP)

我正在考虑编写一个用户定义的函数,其调用类似于:

where MyFunction(MyColumn, @MyTVP)

并且该函数会将MyColumn拆分为单独的值(例如C#的arr.Split(','))并查看这些值是否在@MyTVP中。

首先,这是一个合理的解决方案,还是应该走另一条路?

其次,是否有一种有效的方法可以查看MyColumn中的多个值是否为IN @MyTVP

2 个答案:

答案 0 :(得分:1)

你正在玩火:)嗯,这是火柴盒: STRING_SPLIT()

CREATE TABLE #T (ID INT , Value VARCHAR(100))
INSERT INTO #T VALUES (1 , '1,2,3') , (2 , '4,5,6') , (3 , '7,8,9')

SELECT t1.ID, t2.value
FROM #T AS t1
CROSS APPLY STRING_SPLIT(Value, ',') AS t2

ID  value
---------
1   1
1   2
1   3
2   4
2   5
2   6
3   7
3   8
3   9

答案 1 :(得分:0)

示例数据

CREATE TABLE #T (ID INT , Value VARCHAR(100))

INSERT INTO #T VALUES (1 , '1,2,3') , (2 , '4,5,6') , (3 , '7,8,9')

<强>查询

SELECT DISTINCT ID , Value
FROM (
        SELECT    ID
                , Value
                , Split.a.value('.', 'VARCHAR(100)') SplitedValues
        FROM   
            (
             SELECT  ID 
                    ,Value
                    ,Cast ('<X>' + Replace(Value, ',', '</X><X>') + '</X>' AS XML) AS Data
            FROM    #T
            ) AS t 
                CROSS APPLY Data.nodes ('/X') AS Split(a) 
    )x
WHERE x.SplitedValues IN (1 ,9)  -- Replace these hardcoded values with your tvp