我有一个tbl,其字段的值是以管道分隔的,我需要将它们提取为行。
示例数据
select distinct [PROV_KEY],
[NTWK_CDS]
FROM [SPOCK].[US\AC39169].[WellPointExtract_ERR]
where [PROV_KEY] = '447358B0A8E1C0F1B7AEB1ED07EC2F25'
--results
PROV_KEY NTWK_CDS
447358B0A8E1C0F1B7AEB1ED07EC2F25 |GA_HMO|GA_OPN|GA_PPO|GA_BD|GA_MCPPO|GA_HDPPO|
我想:
PROV_KEY NTWK_CDS
447358B0A8E1C0F1B7AEB1ED07EC2F25 GA_HMO
447358B0A8E1C0F1B7AEB1ED07EC2F25 GA_OPN
447358B0A8E1C0F1B7AEB1ED07EC2F25 GA_PPO
我尝试了以下内容,但我只获得了第一组值:
select distinct [PROV_KEY],
substring([NTWK_CDS], 1,
CHARINDEX('|',[NTWK_CDS], CHARINDEX('|',[NTWK_CDS])+1))
FROM [SPOCK].[US\AC39169].[WellPointExtract_ERR]
where [PROV_KEY] = '447358B0A8E1C0F1B7AEB1ED07EC2F25'
答案 0 :(得分:0)
这是一个标准的字符串拆分问题,有很多解决方案。但是大多数仍然感觉像是一种解决方法,因为SQL Server没有内置拆分功能。
您可以在此处开始您的研究:http://www.sommarskog.se/arrays-in-sql.html
答案 1 :(得分:0)
您需要执行的关键操作是拆分。这个问题有很多解决方案(有些人可以参见here),人们会根据情况和个人喜好来选择不同的解决方案。但是,完成拆分后,您可以对结果进行JOIN或APPLY以获得所需的输出。
我个人更喜欢使用SQLCLR功能,因为性能通常要好得多;但那里的选择数量惊人。
答案 2 :(得分:0)
您可以使用拆分功能
CREATE FUNCTION dbo.SplitStrings_CTE(@List nvarchar (1000), @Delimiter nvarchar(1 ))
RETURNS @returns TABLE(val nvarchar(100), [level] int, PRIMARY KEY CLUSTERED([level]))
AS
BEGIN
;WITH cte AS
(
SELECT SUBSTRING(@List, 0, CHARINDEX(@Delimiter , @List)) AS val ,
CAST(STUFF(@List + @Delimiter, 1, CHARINDEX(@Delimiter, @List),'') AS nvarchar (1000)) AS stval,
1 AS [level]
UNION ALL
SELECT SUBSTRING(stval, 0, CHARINDEX(@Delimiter, stval)),
CAST(STUFF(stval, 1 , CHARINDEX(@Delimiter ,stval), '') AS nvarchar(1000)),
[level] + 1
FROM cte
WHERE stval != ''
)
INSERT @returns
SELECT REPLACE(val ,' ' ,'') AS val, [level]
FROM cte
RETURN
END
因此,您的SELECT语句将是
SELECT *
FROM dbo.test82 t CROSS APPLY dbo.SplitStrings_CTE(t.NTWK_CDS, '|') o
WHERE o.val != ''
SQLFiddle上的演示