Get Nth Item From a Delimited String List

Applicability:

SQL Server 2000: Tested

SQL Server 2005: Tested

SQL Server 2008: Tested

SQL Server 2008R2: Tested

SQL Server 2012: Not Tested

Credits:

Author: ChillyDBA

Date: 17 Jul 2012

Description

This is based around the same code as the very fast string splitter function and will return the Nth item from a delimited list supplied as a single string

ie the 4th item from 'this, is , a ,comma, delimited, string' would be 'comma'

Code

Function:

DROP FUNCTION dbo.udf_GetNthItemFromDelimitedStringList

GO

CREATE FUNCTION dbo.udf_GetNthItemFromDelimitedStringList

(

@List VARCHAR(8000), -- the delimited list

@Delimiter CHAR(1), -- the delimiter

@N INT -- the list item number required

)

RETURNS VARCHAR(8000)

AS

/**********************************************************

Purpose: Returns the Nth item from a delimited string list.

Author: ChillyDBA

History 17 Jul 2012 - Initial Issue

***********************************************************/

BEGIN

DECLARE @Result VARCHAR(8000)

-- remove and CR/LF characters

SET @List = REPLACE(REPLACE(@List,CHAR(10),''),CHAR(13),'')

SELECT @Result = x.value

FROM

(

SELECT

ROW_NUMBER() OVER (ORDER BY i ASC) AS RowNumber,

LTRIM(SUBSTRING(@Delimiter + @List + @Delimiter , w.i + 1, CHARINDEX(@Delimiter , @Delimiter + @List + @Delimiter , w.i + 1) - w.i - 1)) value

FROM

(

SELECT TOP 100 PERCENT

v0.n + v1.n + v2.n + v3.n i

FROM

(

SELECT 0 n UNION ALL SELECT 1 UNION ALL

SELECT 2 UNION ALL SELECT 3 UNION ALL

SELECT 4 UNION ALL SELECT 5 UNION ALL

SELECT 6 UNION ALL SELECT 7 UNION

SELECT 8 UNION ALL SELECT 9 UNION ALL

SELECT 10 UNION ALL SELECT 11 UNION ALL

SELECT 12 UNION ALL SELECT 13 UNION ALL

SELECT 14 UNION ALL SELECT 15

) AS v0,

(

SELECT 0 n UNION ALL SELECT 16 UNION ALL

SELECT 32 UNION ALL SELECT 48 UNION ALL

SELECT 64 UNION ALL SELECT 80 UNION ALL

SELECT 96 UNION ALL SELECT 112 UNION

SELECT 128 UNION ALL SELECT 144 UNION ALL

SELECT 160 UNION ALL SELECT 176 UNION ALL

SELECT 192 UNION ALL SELECT 208 UNION ALL

SELECT 224 UNION ALL SELECT 240

) AS v1,

(

SELECT 0 n UNION ALL SELECT 256 UNION ALL

SELECT 512 UNION ALL SELECT 768 UNION ALL

SELECT 1024 UNION ALL SELECT 1280 UNION ALL

SELECT 1536 UNION ALL SELECT 1792 UNION

SELECT 2048 UNION ALL SELECT 2304 UNION ALL

SELECT 2560 UNION ALL SELECT 2816 UNION ALL

SELECT 3072 UNION ALL SELECT 3328 UNION ALL

SELECT 3584 UNION ALL SELECT 3840

) AS v2,

(

SELECT 0 n UNION ALL SELECT 4096

) AS v3 ORDER BY i

) w

WHERE w.i = CHARINDEX(@Delimiter , @Delimiter + @List + @Delimiter , w.i)

AND w.i < LEN(@Delimiter + @List)

) AS x

WHERE RowNumber = @N

RETURN @Result

END

Test Code:

SELECT dbo.udf_GetNthItemFromDelimitedStringList('this, is, a, comma,delimited, list', ',', 3)

SELECT dbo.udf_GetNthItemFromDelimitedStringList('the^quick^brown^carat^jumped^over^the^lazy^dog', '^', 4)