Please try this ( SQL 2016 + )
Data Generation
CREATE TABLE Splits
(
optionValues varchar(20)
,optionNames varchar(200)
)
GO
INSERT INTO Splits VALUES
('0~1','male~female'),
('0~1~2','male~female~Trans'),
('0~1','male~F')
GO
SOLUTION
DECLARE @Find AS VARCHAR(10) = '1'
;WITH CTE0 AS
(
SELECT * , ROW_NUMBER() OVER (ORDER BY ( SELECT NULL ) ) rnk FROM Splits
)
,CTE AS
(
SELECT * , ROW_NUMBER() OVER (PARTITION BY rnk ORDER BY rnk) rnk1 FROM CTE0
CROSS APPLY
(
SELECT Value
FROM STRING_SPLIT(optionValues, '~'))
p
)
,CTE1 AS
(
SELECT * , ROW_NUMBER() OVER (PARTITION BY rnk ORDER BY rnk) rnk1 FROM CTE0
CROSS APPLY
(
SELECT Value
FROM STRING_SPLIT(optionNames, '~'))
p1
)
SELECT s.*,ISNULL(p.value,'') Value FROM Splits s
LEFT JOIN
(
SELECT a.optionValues, a.optionNames , b.value FROM CTE a
INNER JOIN CTE1 b ON a.optionNames = b.optionNames
AND a.optionValues = b.optionValues AND a.rnk = b.rnk AND a.rnk1 = b.rnk1
WHERE a.value = @Find
)p ON p.optionValues = s.optionValues AND p.optionNames = s.optionNames
OUTPUT
optionValues optionNames Value
-------------------- ------------------------ ---------
0~1 male~female female
0~1~2 male~female~Trans female
0~1 male~F F
(3 rows affected)
Added for Solution for SQL 2012+
DECLARE @Find AS VARCHAR(10) = '1'
;WITH CTE0 AS
(
SELECT * , ROW_NUMBER() OVER (ORDER BY ( SELECT NULL ) ) rnk FROM Splits
)
,CTE AS
(
SELECT * , ROW_NUMBER() OVER (PARTITION BY rnk ORDER BY rnk) rnk1 FROM
(
SELECT *,CAST('<A>'+ REPLACE(optionValues,'~','</A><A>')+ '</A>' AS XML) po
FROM CTE0
)rt
CROSS APPLY ( SELECT t.value('.', 'VARCHAR(10)') Value FROM po.nodes('/A') AS x(t) ) o
)
,CTE1 AS
(
SELECT * , ROW_NUMBER() OVER (PARTITION BY rnk ORDER BY rnk) rnk1 FROM
(
SELECT *,CAST('<A>'+ REPLACE(optionNames,'~','</A><A>')+ '</A>' AS XML) po
FROM CTE0
)rt
CROSS APPLY ( SELECT t.value('.', 'VARCHAR(10)') Value FROM po.nodes('/A') AS x(t) ) o
)
SELECT s.*,ISNULL(p.value,'') Value FROM Splits s
LEFT JOIN
(
SELECT a.optionValues, a.optionNames , b.value , a.rnk FROM CTE a
INNER JOIN CTE1 b ON a.optionNames = b.optionNames
AND a.optionValues = b.optionValues AND a.rnk = b.rnk AND a.rnk1 = b.rnk1
WHERE a.value = @Find
)p ON p.optionValues = s.optionValues AND p.optionNames = s.optionNames
ORDER BY rnk
OUTPUT
optionValues optionNames Value
-------------------- ----------------------- ----------
0~1 male~female female
0~1~2 male~female~Trans female
0~1 male~F F
(3 rows affected)