Kranti Singh
Kranti Singh

Reputation: 187

compare comma separated values in sql

I am trying to write a function to compare comma separated values in SQL I've taken some code from Internet :

SELECT CASE WHEN EXISTS 
(
  SELECT 1 FROM dbo.Split(@v1)
  WHERE ', ' + LTRIM(@v2) + ',' 
  LIKE '%, ' + LTRIM(Item) + ',%'
) THEN 1 ELSE 0 END;

Then I make a function :

CREATE FUNCTION [dbo].[fnCompareCSVString] 
(   
    @str1 nvarchar(50),
    @str2 nvarchar(50)
)

RETURNS  int
AS
BEGIN
    SELECT CASE WHEN EXISTS 
    (
       SELECT 1 FROM dbo.Split(@str1)
       WHERE ', ' + LTRIM(@str2) + ',' 
         LIKE '%, ' + LTRIM(Item) + ',%'
    ) THEN 1 ELSE 0 END;
END

I am not good in SQL I know this is wrong

Question:

I want to write a function for comparing comma separated values that will take two values (comma separated values) after comparison the return value will be true or false

What changes I have to do in this SQL function ?

Upvotes: 3

Views: 13068

Answers (2)

Priyanka Davle
Priyanka Davle

Reputation: 1

DECLARE @user_ids NVARCHAR(MAX) = N'203616, 198667, 193718, 188769, 183820, 178871, 173922, 168973, 164024, 159075, 154126, 149177, 144228, 139279, 134330, 129381, 124432, 119483, 114534, 109585, 104636, 99687, 94738, 89789, 84840, 79891, 74942, 69993, 65044, 60095, 55146'
 
DECLARE @sql_xml XML = Cast('<root><U>'+ Replace(@user_ids, ',', '</U><U>')+ '</U></root>' AS XML)
    
SELECT f.x.value('.', 'BIGINT') AS user_id
INTO #users
FROM @sql_xml.nodes('/root/U') f(x)
    
SELECT * 
FROM #users

Table Image

Upvotes: 0

Kane
Kane

Reputation: 16802

Is this what you are looking for?

True / False results

-- matches only those values which exist in both CSV sets
SELECT T1.[Item], CASE  WHEN T2.[Item] IS NULL THEN 0 ELSE 1 END AS [Match] 
FROM [dbo].[Split]('val1,val2,val3', ',') AS T1
    LEFT JOIN [dbo].[Split]('val3,val4', ',') AS T2 on T1.[Item] = T2.[Item]

Returns

Item    Match
val1    0
val2    0
val3    1

Only true matches

-- matches only those values which exist in both CSV sets
SELECT T1.[Item] 
FROM [dbo].[Split]('val1,val2,val3', ',') AS T1
    INNER JOIN [dbo].[Split]('val3,val4', ',') AS T2 on T1.[Item] = T2.[Item]

Returns

Item
val3

Split function

CREATE FUNCTION [dbo].[Split] 
(   
    @s VARCHAR(max),
    @split CHAR(1)
)
RETURNS @temptable TABLE ([Item] VARCHAR(MAX))    
AS
BEGIN
    DECLARE @x XML

    SELECT @x = CONVERT(xml,'<root><s>' + REPLACE(@s,@split,'</s><s>') + '</s></root>');

    INSERT INTO @temptable          
    SELECT [Value] = T.c.value('.','varchar(20)')
    FROM @X.nodes('/root/s') T(c);
RETURN
END;

Upvotes: 1

Related Questions