SQL Server - 写入查询,用于规范化构造不良的模式中的逗号分隔值

问题描述 投票:0回答:2

问题:我正在查询规范化程度不高的数据库(我在数据设计中没有发言权并且无法更改)

鉴于以下数据库:

------------------------------------------
|      Name      |         Codes          |
------------------------------------------
|       Josh     |    A2A-8292            |
-------------------------------------------
|       Adam     |    D2C-1292, B2A-7292  |
-------------------------------------------
|       Jery     |    A2A-1292, F2A-2292, | 
|                |    C2A-2292            |
-------------------------------------------

如何编写返回规范化版本的查询,例如:

 ------------------------------------------
|      Name      |         Codes          |
------------------------------------------
|       Josh     |    A2A-8292            |
-------------------------------------------
|       Adam     |    D2C-1292            |
-------------------------------------------
|       Adam     |    B2A-7292            |
-------------------------------------------
|       Jery     |    A2A-1292            |
-------------------------------------------
|       Jery     |    F2A-2292            |
-------------------------------------------
|       Jery     |    C2A-2292            |
-------------------------------------------
sql-server sql-server-2012 database-normalization
2个回答
1
投票

如果您不能使用TVF,这是另一种选择

Select A.Name 
      ,B.*
 From  YourTable A
 Cross Apply (
                Select RetSeq = row_number() over (order by (Select null))
                      ,RetVal = ltrim(rtrim(B2.i.value('(./text())[1]', 'varchar(max)')))
                From  (Select x = Cast('<x>' + replace(Codes,',','</x><x>')+'</x>' as xml).query('.')) as B1
                Cross Apply x.nodes('x') AS B2(i)
             ) B

返回

Name    RetSeq  RetVal
Josh    1       A2A-8292
Adam    1       D2C-1292
Adam    2       B2A-7292
Jery    1       A2A-1292
Jery    2       F2A-2292
Jery    3       C2A-2292

0
投票

从这个答案中取出字符串拆分功能:T-SQL split string

您可以按以下方式运行查询:

SELECT T.Name, X.*
FROM TABLE AS T
CROSS APPLY dbo.splitstring(Codes) AS X;
© www.soinside.com 2019 - 2024. All rights reserved.