我在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
SELECT value FROM STRING_SPLIT('Lorem ipsum dolor sit amet.', ' ');
它将通过空格拆分并返回所有值。
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)
首先,我完全同意Marc_s的评论 - 绝对不能将多个值存储在单个列中。
要了解更多信息,请阅读在数据库列中存储分隔列表真的那么糟糕吗?,您将看到很多原因,为什么这个问题的答案是绝对是的!
现在,假设您无法更改数据库结构,下面是一种使用Left
和Right
以及charIndex
的方法
创建并填充示例表格(请在您未来的问题中省略此步骤)
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