将管道分隔的字段提取到行中

时间:2013-05-09 21:22:58

标签: sql sql-server-2008

我有一个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'

3 个答案:

答案 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上的演示