2017-06-14 72 views
1

您好我有一個SQL Server表一個列有逗號分隔值:SQL選擇拆分列,然後在其他分發現選擇

12323,234322,1112,99323..... 

而且我有一個參數@values nvarchar(500),也將有逗號分隔值。

在我的查詢中,我需要檢查參數是否存在於我的表格字段中。上述

像這樣的事情>

... 
WHERE 
(@values = '' OR select s from dbo.Split(',',t.Data) in (select s from dbo.Split(',',@values))) 

當然給我的錯誤。

任何線索?

+1

查看CROSS APPLY,或發佈更強大的示例以獲得更多幫助。 –

回答

0

加入你下了分裂

SELECT * 
... 
FROM (SELECT s FROM dbo.Split(',',t.Data)) X 
INNER JOIN (SELECT s FROM dbo.Split(',',@values)) Y 
ON X.s = Y.s 
... 
+0

這是一個完全獨立的選擇我需要它在我的where語句 – VAAA

0

EXISTS是你的朋友在這裏的兩個表。

WHERE 
(@values = '' OR EXISTS (select a.value from string_split(t.Data, ',') a inner join (select value from string_split(@values, ',')) b ON a.value = b.value)) 
0

試試這個下面的代碼它可能會幫助你

IF OBJECT_ID('Tempdb..#Temp') IS NOT NULL 
Drop table #Temp 

Declare @SearchVariable varchar(1000)='12323,234322,1112,99323,22222,4545,656565,8989,1111,22222'--Varibale Contains these values to search 

CREATE TABLE #Temp (CommaValue Varchar(100))-- This is the table having comma separted value columns 
INSERT INTO #Temp 
SELECT '12323,234322,1112,99323' Union all 
SELECT '12323,656565,1112,4545' 

Declare @VariableSearch TABLE (ValueName varchar(1000)) 
Insert into @VariableSearch 

SELECT @SearchVariable 
;With cte 
AS 
(
SELECT Split.a.value('.', 'VARCHAR(1000)') AS TablesData 
      FROM (
       SELECT CAST('<S>' + REPLACE(CommaValue, ',', '</S><S>') + '</S>' AS XML) AS TablesData 
       FROM #Temp 
       ) AS A 
      CROSS APPLY TablesData.nodes('/S') AS Split(a) 
) 
SELECT DISTINCT ROW_NUMBER()Over(Order by (SELECT 1)) AS Rno, * from cte C Inner join 
(
SELECT Split.a.value('.', 'VARCHAR(1000)') AS VariableSeachData 
      FROM (
       SELECT CAST('<S>' + REPLACE(ValueName, ',', '</S><S>') + '</S>' AS XML) AS VariableSeachData 
       FROM @VariableSearch 
       ) AS A 
      CROSS APPLY VariableSeachData.nodes('/S') AS Split(a) 
      )DT 
      On C.TablesData=DT.VariableSeachData 

輸出

Rno TablesData VariableSeachData 
--------------------------------- 
1  1112   1112 
2  1112   1112 
3  12323   12323 
4  12323   12323 
5  234322   234322 
6  4545   4545 
7  656565   656565 
8  99323   99323 
0

不太清楚,但也許這可以給你出個主意。使用Outer ApplyEXISTS算子。

SELECT x.value 
    FROM Table T 
      OUTER APPLY (SELECT value 
          FROM  dbo.Split(t.data) 
         ) X 
    WHERE EXISTS (SELECT 1 
         FROM dbo.Split(@values) S 
         WHERE s.value = x.value)