【问题标题】:Convert delimited string to table with SQL Server [duplicate]使用 SQL Server 将分隔字符串转换为表 [重复]
【发布时间】:2013-02-26 10:10:54
【问题描述】:

我有 2 列

ID          value
---      ----------
1        "1,abc,,3"
2        "2,qwe,the,4"

如何将分隔值转换为表格

即:

col1         col2        col3       col4
-----        -----       -----      ----
1            abc                      3
2            qwe         the          4       

希望能尽快得到帮助。提前谢谢..

【问题讨论】:

  • 从2005年到2008年dbserver会有升级..所以使用的方法应该是兼容的。至少现在它应该适用于 2005
  • @marc_s 很公平,我想你就在这里。
  • 您只是想导入包含这些逗号分隔字符串的文本文件吗?这是经常发生的事情,因此导出列然后重新导入它是不可取的吗?
  • csv 不在文本文件中。它是表 varchar 中的一列

标签: sql sql-server sql-server-2008 tsql sql-server-2005


【解决方案1】:

根据您的问题,这只是 4 列的示例。这可以概括:

with cte as(
SELECT id,CHARINDEX(',', value) First_occurence,

CHARINDEX(',', value, CHARINDEX(',', value)+1) Second_occurrence,

CHARINDEX(',', value, CHARINDEX(',', value, CHARINDEX(',', value)+1)+1) Third_occurrence

from test)

select  substring(value,1,first_occurence-1) col1,
substring(value,first_occurence+1,Second_occurrence-(first_occurence+1)) col2,
substring(value,Second_occurrence+1,Third_occurrence-(Second_occurrence+1)) col3,
substring(value,Third_occurrence+1,len(value)) col4

from test a
inner join 
cte b
on a.id=b.id

概括:

Declare @col_count  int=1

;with cte as(
SELECT id, @col_count col,value,CHARINDEX(',', value) occurence,substring(value,1,CHARINDEX(',', value)-1) col_val from test

  union all
select id, col+1 col,value, CHARINDEX(',', value, occurence+1),
  substring(value,occurence+1,CHARINDEX(',', value, occurence+1)-(occurence+1))

  from cte
 where  (occurence+1)< len(value)
union all

select id, col+1 col,value, occurence+1,
  substring(value,occurence+1,len(value))
  from cte
 where  (occurence+1)= len(value)
)



SELECT [1], [2], [3], [4]
from
(
  SELECT col, col_val,
    row_number() over(partition by col order by col_val) rn
  from cte
) as st
pivot
(
  max(col_val)
  FOR col in ([1], [2], [3], [4])
) as pivottable

只需在最终select 中添加 [5] ,[6],.... 即可获得更多列。

SQL Fiddle

【讨论】:

  • @Jeswin James:有帮助吗?
  • 感谢 Ravi.. 虽然我不得不从 ntext (value) 转换为 varchar,但它仍然有效......非常感谢.. :)
猜你喜欢
  • 2011-09-08
  • 2014-08-24
  • 1970-01-01
  • 2013-09-13
  • 2010-10-19
  • 1970-01-01
  • 1970-01-01
  • 2021-06-22
  • 2015-06-02
相关资源
最近更新 更多