Archive for June 23rd, 2009
IN with a comma separated list: SQL Server
From Stack Overflow:
How do I search a table for all values from a comma separated list, or return all values if the list contains a single 0?
Using comma separated lists in SQL Server as a search parameter is generally considered a bad design and should be avoided.
One should pass lists in a table variable rather than in a set of comma separated values.
However, there are legacy applications, ORM's and these kinds of stuff that just leave you no choice.
MySQL provides a nice function find_in_set
designed exactly for this task.
SQL Server does not directly support an IN
predicate for CSV
, neither it provides find_in_set
. It needs a rowset for IN
predicate to work.
To expand a comma separated list into a rowset, we will use a recursive CTE
.
In the CTE
, we should search for the position of every next comma and return it.
Then we can just take the substring between two commas and cast it into an INT
:
DECLARE @lid VARCHAR(100) SET @lid = '3, 14, 15, 296, 5358'; WITH cd AS ( SELECT 1 AS first, CHARINDEX(',', @lid, 1) AS next UNION ALL SELECT next + 1, CHARINDEX(',', @lid, next + 1) FROM cd WHERE next > 0 ), lid AS ( SELECT CAST(SUBSTRING(@lid, first, CASE next WHEN 0 THEN LEN(@lid) + 1 ELSE next END - first)AS INT) AS id FROM cd ) SELECT * FROM lid
id |
---|
3 |
14 |
15 |
296 |
5358 |
Now we just need to return the values from the table found in this list, or all values if there is a single 0 in the list.
Let's create a sample table and build a query to do this:
Read the rest of this entry »