2016-03-18 148 views
0

我有一列有多个值存储在一列中的列表我想将该数据查询到一个文件并将值分开。将列中的多个值拆分为单独的列

示例:此列(SHIFT_LENGTHS)的值以星号的每一天的连接形式存储,以“#”作为分隔符,表示一周中某天的秒数。

SELECT 
    NAME 
,SHIFT_LENGTHS 
FROM SHIFTGUARANTEE 
ORDER BY NAME 

SQL结果

NAME ,SHIFT_LENGTHS 
Shift1,#14400#14400#14400#14400#14400#14400#14400# 

我要查询的数据,并通过这种方式目前它在文件中:

NAME ,Mon ,Tue ,Wed ,Thu ,Fri ,Sat ,Sun 
Shift1,14400,14400,14400,14400,14400,14400,14400 
+0

我觉得这个回答不同的问题是你可以使用 - [我该如何分割字符串,所以我可以访问项x ?](https://stackoverflow.com/a/2677/352349)。 – Anssssss

+0

可能的重复[如何分割字符串,以便可以访问项目x?](http://stackoverflow.com/questions/2647/how-do-i-split-a-string-so-i-can- access-item-x) –

+1

虽然我同意你需要一个字符串分离器,但是上面引用的是从性能角度可以找到的绝对最糟糕的可能。不要使用使用循环或递归类的分离器。他们很坏。这里有一些更好的选择。 http://sqlperformance.com/2012/07/t-sql-queries/split-strings –

回答

1

如果字符串的格式是固定的,因为它似乎你可以用子串函数来解析它:

SELECT 
    NAME 
,SUBSTRING(SHIFT_LENGTHS, 2, 5) mon 
,SUBSTRING(SHIFT_LENGTHS, 8, 5) tue 
,SUBSTRING(SHIFT_LENGTHS, 14, 5) wed 
,SUBSTRING(SHIFT_LENGTHS, 20, 5) thu 
,SUBSTRING(SHIFT_LENGTHS, 26, 5) fri 
,SUBSTRING(SHIFT_LENGTHS, 32, 5) sat 
,SUBSTRING(SHIFT_LENGTHS, 38, 5) sun 
FROM SHIFTGUARANTEE 
ORDER BY NAME 

如果格式不固定,可以使用charindex函数获取分隔符的索引或自定义CLR正则表达式函数。

还有使用交叉很好的解决的答案适用于另一个问题:How to split a comma-separated value to columns

+0

非常感谢,这工作和如果字符串的格式不固定呢? – Kenh426

+0

@ Kenh426如果它不是固定的,你应该看看我链接到的问题的答案。这有点复杂,但并不多。 – jpw