3

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

3 回答 3

0

这是一个标准的字符串拆分问题,有很多解决方案。但是大多数仍然感觉像是一种解决方法,因为 SQL Server 没有内置拆分功能。

你可以在这里开始你的研究:http: //www.sommarskog.se/arrays-in-sql.html

于 2013-05-09T21:29:48.347 回答
0

您需要执行的关键操作是拆分。这个问题有很多解决方案(见这里),人们根据情况和个人喜好偏爱不同的解决方案。但是,一旦您完成了拆分,您就可以 JOIN 或 APPLY 对结果进行操作以获得所需的输出。

我个人更喜欢为此目的使用 SQLCLR 函数,因为性能通常要好得多;但是那里的选择数量是惊人的。

于 2013-05-09T21:33:22.170 回答
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上的演示

于 2013-05-11T11:21:23.457 回答