我有一个SQL Server数据库表具有以下的列:如何根据分隔符将字符串分成两部分?
Field1, Field2, Field3
Field1
类型为字符串的列“|”作为分隔符。
它具有以下形式:
Part1|Part2
我想写一个SQL查询返回以下列:
Part1, Part2, Field2, Field3
什么是做到这一点的最好方法是什么?
我有一个SQL Server数据库表具有以下的列:如何根据分隔符将字符串分成两部分?
Field1, Field2, Field3
Field1
类型为字符串的列“|”作为分隔符。
它具有以下形式:
Part1|Part2
我想写一个SQL查询返回以下列:
Part1, Part2, Field2, Field3
什么是做到这一点的最好方法是什么?
这里的一个选择是利用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
让我开始saing我完全同意Marc_s的评论 - 永远不要将多个值存储在一个列中。
欲了解更多信息,请阅读Is storing a delimited list in a database column really that bad?,在这里你会看到很多原因为什么这个问题的答案是绝对是!现在
,假设你不能更改数据库的结构,这里是charIndex
创建和填充示例表(请保存我们这一步在你未来做用Left
和Right
的一种方式问题)
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
这种方法(除了是短期)的优点是,它不会失败,如果管道失踪。
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)
你应该***从来没有***存储多个值到一个列 - 这违反了连**第一范式**数据库设计的,并会导致你无尽的悲伤和烦恼 - 只是不” t do it –
这真的很简单吗? select replace('Part1 | Part2','|',',')Field1,'Field2'Field2,'Field3'Field3 – KumarHarsh