Reputation: 1614
I have a database table, that has column which stores comma separated string values. Say for example
Row CSVColumn
1. value1, value2
2. value1, value3
3. value2, value4
My search parameter is again comma separated say value2, value4
Now I want to return all those rows which matches search parameter. In this example should return Row 1 and Row 3.
Can somebody help in writing MS SQL query for this?
Upvotes: 0
Views: 1021
Reputation: 2768
How About this example. I am splitting string into rows for Search string and for CSVColumn.
After that I just INNER JOIN them.
I am using xml for splitting but you also can create function for this.
DECLARE @CsvTable TABLE (Rowid INT, CsvColumn VARCHAR(MAX))
INSERT INTO @CsvTable SELECT '1', 'value1'
INSERT INTO @CsvTable SELECT '2', 'value1, value3'
INSERT INTO @CsvTable SELECT '3', 'value2, value4'
DECLARE @SearchText VARCHAR(20) = 'value2, value3'
;WITH SearchTable AS (
SELECT LTRIM(O.splitdata) AS Searchdata
FROM (
SELECT CAST('<X>'+replace(@SearchText,',','</X><X>')+'</X>' AS XML) AS XmlData
) AS xT
CROSS APPLY
(
SELECT xdata.D.value('.', 'VARCHAR(50)') AS splitdata
FROM xT.XmlData.nodes('X') as xdata(D)
) O
), SplitTable AS (
SELECT xT.Rowid,
LTRIM(O.splitdata) AS splitdata
FROM (
SELECT T.Rowid, CAST('<X>'+replace(T.CsvColumn,',','</X><X>')+'</X>' AS XML) AS XmlData
FROM @CsvTable AS T
) AS xT
CROSS APPLY
(
SELECT xdata.D.value('.', 'VARCHAR(50)') AS splitdata
FROM xT.XmlData.nodes('X') as xdata(D)
) O
)
SELECT DISTINCT CT.*
FROM @CsvTable AS CT
INNER JOIN SplitTable AS SplitT
ON SplitT.RowID = CT.RowID
INNER JOIN SearchTable AS SrchT
ON SrchT.Searchdata = SplitT.splitdata
Upvotes: 2