Arrays SQL Server 2005:将字符串拆分为数组并获取数组(x)?

Arrays SQL Server 2005:将字符串拆分为数组并获取数组(x)?,arrays,sql-server-2005,split,Arrays,Sql Server 2005,Split,我在数据库表中有如下字符串: Peter/Parker/Spiderman/Marvel Bruce/Wayne/Batman/DC SQL中是否有方法从字符串中提取特定值,例如 Name = MyColumn(0) SurName = MyColumn(1) Character = MyColumn(3) Company = MyColumn(4) 谢谢我在这里假设总有4个部分 如果是这样,您可以将/替换为,并使用漂亮的内置函数。您的示例中唯一的问题是,它从结尾算起,因此您需要小心选择所需

我在数据库表中有如下字符串:

Peter/Parker/Spiderman/Marvel
Bruce/Wayne/Batman/DC
SQL中是否有方法从字符串中提取特定值,例如

Name = MyColumn(0)
SurName = MyColumn(1)
Character = MyColumn(3)
Company = MyColumn(4)

谢谢

我在这里假设总有4个部分

如果是这样,您可以将
/
替换为
,并使用漂亮的内置函数。您的示例中唯一的问题是,它从结尾算起,因此您需要小心选择所需的部分:

DECLARE @test VARCHAR(max);
SET @test = 'Peter/Parker/Spiderman/Marvel';
SET @test = Replace(@test, '/', '.');

SELECT Parsename(@test, 4),--returns Peter
       Parsename(@test, 3),--returns Parker
       Parsename(@test, 2),--returns Spiderman
       Parsename(@test, 1) --returns Marvel
如果有数量可变的部件,您需要找到一个字符串拆分函数来完成这项工作,但没有一个好的内置函数。搜索时可以找到许多选项,因此:


警告-如果您尝试使用除1-4之外的带有
PARSENAME
的数字,则结果将始终为空。

如果您知道将有正好4列,则也可以使用此嵌套CTE版本:

;with s1 (name, extra) as
(
  select left(data, charindex('/', data)-1), 
    substring(data, charindex('/', data) +1, len(data))
  from yourtable
),
s2 (name, surname, extra) as
(
  select name, 
    left(extra, charindex('/', extra)-1), 
    substring(extra, charindex('/', extra)+1, len(extra))
  from s1
),
s3 (name, surname, [character], company) as
(
  select name, 
    surname, 
    left(extra, charindex('/', extra)-1), 
    substring(extra, charindex('/', extra)+1, len(extra))
  from s2
)
select *
from s3;

结果是:

|  NAME | SURNAME | CHARACTER | COMPANY |
-----------------------------------------
| Peter |  Parker | Spiderman |  Marvel |
| Bruce |   Wayne |    Batman |      DC |
或者,您可以同时实现分割数据的CTE和透视:

;with cte (item, data, colNum, rn) as
(
  select cast(left(data, charindex('/',data+'/')-1) as varchar(50)) item,
    stuff(data, 1, charindex('/',data+'/'), '') data,
    1 colNum,
    row_number() over(order by data) rn
  from yourtable
  union all
  select cast(left(data, charindex('/',data+'/')-1) as varchar(50)) ,
    stuff(data, 1, charindex('/',data+'/'), '') data,
    colNum+1, 
    rn
  from cte
  where data > ''
) 
select [1] as Name, 
  [2] as Surname, 
  [3] as [character], 
  [4] as company
from
(
  select item, colnum, rn
  from cte
) src
pivot
(
  max(item)
  for colnum in ([1], [2], [3], [4])
) piv

请参见

您的数据中是否有数目未知的斜杠
/
?还是总是有3个?