如何根据分隔符将字符串拆分为两个部分?

3

我在SQL Server数据库中有一张表,包含以下列:

Field1, Field2, Field3

Field1是一个字符串类型的列,使用竖杠“|”作为分隔符。

它的格式如下:

Part1|Part2
我可以帮您翻译。需要编写一条SQL查询语句,返回以下列:
Part1, Part2, Field2, Field3
什么是最好的方法来做到这一点?

1
你绝对不能把多个值存储到同一列中 - 这违反了数据库设计的第一范式,会给你带来无尽的痛苦和麻烦 - 千万不要这样做。 - undefined
真的这么简单吗?选择替换('Part1|Part2','|',',') 作为 Field1, 'Field2' 作为 Field2, 'Field3' 作为 Field3 - undefined
4个回答

3

这里有一个选择是利用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

1
这里有一个简单的函数,可以用来在数据库中拆分字符串:
SELECT value FROM STRING_SPLIT('Lorem ipsum dolor sit amet.', ' ');

它将通过空格拆分并返回所有值。


1
这种方法的优点(除了很短之外),就是当管道缺失时不会失败。
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)

0

首先,我完全同意Marc_s的评论 - 绝对不能将多个值存储在单个列中。
要了解更多信息,请阅读在数据库列中存储分隔列表真的那么糟糕吗?,您将看到很多原因,为什么这个问题的答案是绝对是的!

现在,假设您无法更改数据库结构,下面是一种使用LeftRight以及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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,