2017-02-27 255 views
0

我有一个SQL Server数据库表具有以下的列:如何根据分隔符将字符串分成两部分?

Field1, Field2, Field3 

Field1类型为字符串的列“|”作为分隔符。

它具有以下形式:

Part1|Part2 

我想写一个SQL查询返回以下列:

Part1, Part2, Field2, Field3 

什么是做到这一点的最好方法是什么?

+1

你应该***从来没有***存储多个值到一个列 - 这违反了连**第一范式**数据库设计的,并会导致你无尽的悲伤和烦恼 - 只是不” t do it –

+0

这真的很简单吗? select replace('Part1 | Part2','|',',')Field1,'Field2'Field2,'Field3'Field3 – KumarHarsh

回答

1

这里的一个选择是利用SQL Server的基本字符串函数SUBSTRING()CHARINDEX()将管道字符上的两部分Field1分开。

SELECT SUBSTRING(Field1, 1, CHARINDEX('|', Field1)-1) AS Part1, 
     SUBSTRING(Field1, CHARINDEX('|', Field1)+1, LEN(Field1)) AS Part2, 
     Field2, 
     Field3 
FROM yourTable 
0

让我开始saing我完全同意Marc_s的评论 - 永远不要将多个值存储在一个列中。
欲了解更多信息,请阅读Is storing a delimited list in a database column really that bad?,在这里你会看到很多原因为什么这个问题的答案是绝对是!现在

,假设你不能更改数据库的结构,这里是charIndex

创建和填充示例表(保存我们这一步在你未来做用LeftRight的一种方式问题)

DECLARE @T AS TABLE 
( 
    Col varchar(10) 
) 

INSERT INTO @T VALUES 
('a|b'), 
('ab|cd'), 
('abc|def'), 
('abcd|efgh'), 
('abcde|fghi') 

查询:

SELECT Col, 
     LEFT(Col, CHARINDEX('|', Col)-1) As Part1, 
     RIGHT(Col, LEN(Col) - CHARINDEX('|', Col)) As Part2 
FROM @T 

结果:

Col    Part1 Part2 
a|b    a  b 
ab|cd   ab  cd 
abc|def   abc  def 
abcd|efgh  abcd efgh 
abcde|fghi  abcde fghi 
0

这种方法(除了是短期)的优点是,它不会失败,如果管道失踪。

SELECT 
    SUBSTRING(Field1, 0, charindex('|',Field1)) Part1, 
    STUFF(Field1,1,charindex('|',Field1),'') Part2, 
    Field2, 
    Field3 
FROM (values('abc|def','val2','val3')) x(Field1, field2, Field3)