, если вы хотите получить только первые три элемента, попробуйте вложить CHARINDEX следующим образом:
DECLARE @YourTable table (csv varchar(50))
INSERT @YourTable VALUES ('aaa,bb,c,dd,eeee')
INSERT @YourTable VALUES ('aaa,bb,c,dd')
INSERT @YourTable VALUES ('aaa,bb,c')
INSERT @YourTable VALUES ('aaa,bb')
INSERT @YourTable VALUES ('aaa')
INSERT @YourTable VALUES (null)
SELECT
csv
,CHARINDEX(',',csv+',',CHARINDEX(',',csv+',',CHARINDEX(',',csv+',',0)+1)+1) AS ThirdComma
FROM @YourTable
WHERE CHARINDEX(',',csv,0)>0
AND CHARINDEX(',',csv+',',CHARINDEX(',',csv+',',CHARINDEX(',',csv+',',0)+1)+1)>0
OUTPUT:
csv
-------------------------------------------------- -----------
aaa,bb,c,dd,eeee 9
aaa,bb,c,dd 9
aaa,bb,c 9
это вернет только строки, где есть три элемента.если вы хотите, чтобы их было один, два и / или три, попробуйте это:
DECLARE @YourTable table (csv varchar(50))
INSERT @YourTable VALUES ('aaa,bb,c,dd,eeee')
INSERT @YourTable VALUES ('aaa,bb,c,dd')
INSERT @YourTable VALUES ('aaa,bb,c')
INSERT @YourTable VALUES ('aaa,bb')
INSERT @YourTable VALUES ('aaa')
INSERT @YourTable VALUES (null)
;WITH FindThird AS
(
SELECT csv, CHARINDEX(',',csv+',',CHARINDEX(',',csv+',',CHARINDEX(',',csv+',',0)+1)+1) AS ThirdComma
FROM @YourTable
)
SELECT
csv
,CASE
WHEN ThirdComma IS NULL OR ThirdComma=0 THEN LEN(csv)+1
ELSE ThirdComma
END AS ThirdComma
FROM FindThird
ВЫХОД:
csv ThirdComma
------------------- -----------
aaa,bb,c,dd,eeee 9
aaa,bb,c,dd 9
aaa,bb,c 9
aaa,bb 7
aaa 4
NULL NULL