Sql server 2008 将分隔字段拆分为同一记录中的独立列

Sql server 2008 将分隔字段拆分为同一记录中的独立列,sql-server-2008,Sql Server 2008,我需要拆分以管道分隔的字段“Y | N | Y | Y” 我找到了这里列出的递归函数 但它会将这些值创建到新记录中 row field 1 Y 2 N 3 Y 4 N 我需要转换“Y | N | Y | Y” field 'Y|N|Y|Y' 进入 有人能给我指出正确的方向吗?如果我说值的数量是固定的,它可能会在一个字段中分隔8个值 Update:一个可能的字段值可以是这个注释:空白值: “Y | 10 | N | 1 | Y”如果字段的

我需要拆分以管道分隔的字段“Y | N | Y | Y”

我找到了这里列出的递归函数

但它会将这些值创建到新记录中

row   field
 1      Y
 2      N
 3      Y
 4      N
我需要转换“Y | N | Y | Y”

field
'Y|N|Y|Y' 
进入

有人能给我指出正确的方向吗?如果我说值的数量是固定的,它可能会在一个字段中分隔8个值

Update:一个可能的字段值可以是这个注释:空白值:


“Y | 10 | N | 1 | Y”

如果字段的宽度也始终是固定的,即1个字符的Y/N,则只需使用子字符串函数即可获得所有单个字段值:

;with Data as (
    select 'Y|N|Y|Y' as choices union
    select 'Y|Y|Y|Y' as choices union
    select 'Y|N|N|Y' as choices union
    select 'Y|N|N|N' as choices union
    select 'N|N|Y|N' as choices union
    select 'Y|Y|N|Y' as choices
)
select
    substring(choices, 1, 1) as field1,
    substring(choices, 3, 1) as field2,
    substring(choices, 5, 1) as field3,
    substring(choices, 7, 1) as field4
from
    Data
输出:

field1  field2  field3  field4
N       N       Y       N
Y       N       N       N
Y       N       N       Y
Y       N       Y       Y
Y       Y       N       Y
Y       Y       Y       Y
field1  field2  field3  field4
Y       N       Y       Y
Y       Y       Y       Y
Y       No      N       Y
Yes     N       N       N
N       N       Yes     No
Y       Y       N       Yes
如果不能保证字段的宽度是相同的,那么可以使用charindex和字段索引的helper表来生成所需的输出。随着字段数量的增加,这会变得非常冗长,但如果要固定字段数量,则只需编写一次:

;with Data as (
    select 1 as id, 'Y|N|Y|Y' as choices union
    select 2,'Y|Y|Y|Y' as choices union
    select 3,'Y|No|N|Y' as choices union
    select 4,'Yes|N|N|N' as choices union
    select 5,'N|N|Yes|No' as choices union
    select 6,'Y|Y|N|Yes' as choices
), Fields as (
    select
        id,
        charindex('|', choices) as field1end,
        charindex('|', choices, charindex('|', choices) + 1) as field2end,
        charindex('|', choices, charindex('|', choices, charindex('|', choices) + 1) + 1) as field3end,
        len(choices) + 1 as field4end
    from
        Data
)
select
    substring(choices, 1, field1end - 1) as field1,
    substring(choices, field1end + 1, field2end - field1end - 1) as field2,
    substring(choices, field2end + 1, field3end - field2end - 1) as field3,
    substring(choices, field3end + 1, field4end - field3end - 1) as field4
from
    Data D
inner join
    Fields F on D.id = F.id
输出:

field1  field2  field3  field4
N       N       Y       N
Y       N       N       N
Y       N       N       Y
Y       N       Y       Y
Y       Y       N       Y
Y       Y       Y       Y
field1  field2  field3  field4
Y       N       Y       Y
Y       Y       Y       Y
Y       No      N       Y
Yes     N       N       N
N       N       Yes     No
Y       Y       N       Yes

**编辑:**我的仍然适用于示例字符串

这里有一个备选答案,因为您知道宽度是固定长度:

DECLARE @myString AS nvarchar(20) = 'Y|10|N|1||Y'

;WITH cte
AS
(
SELECT
    KeyCol = @@IDENTITY,
    CONVERT(XML,'<i>' + REPLACE(@myString, '|', '</i><i>') + '</i>') AS delimited_str
)
SELECT 
    [1] AS Field1,
    [2] AS Field2,
    [3] AS Field3,
    [4] AS Field4,
    [5] AS Field5,
    [6] AS Field6,
    [7] AS Field7,
    [8] AS Field8
FROM(
    SELECT 
        KeyCol,
        ROW_NUMBER() OVER (partition by KeyCol order by KeyCol)as col_nbr,
        x.i.value('.', 'VARCHAR(50)') AS delimited_VAL
    FROM cte
    CROSS APPLY delimited_str.nodes('//i') AS x(i)
    ) as PivotedDataTable
PIVOT
(MAX(delimited_VAL) FOR col_nbr IN
([1], [2], [3], [4], [5], [6], [7], [8])
) AS PivotTable;
编辑:当我遇到类似的问题时,我知道我以前在某个地方看到过这一点:

是的,如果说值的数量是固定的,那么问题就容易多了。字段的宽度是否也固定,即始终为Y/N?宽度始终为一个或两个字符。可以是y/n值,也可以是2位数字。谢谢,我来看看这个。更新:可以是0、1或2个字符长。一个可能的字段值可以是:“Y | 10 | N | 1 | Y”