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 »
Subscribe in a reader