Sql 分离同一数据库列中的记录
对标题很抱歉,但这个问题很难概括。我正在处理一个构造糟糕的数据库,遇到一个表,该表在同一列上有多条记录,如下所示:Sql 分离同一数据库列中的记录,sql,sql-server,Sql,Sql Server,对标题很抱歉,但这个问题很难概括。我正在处理一个构造糟糕的数据库,遇到一个表,该表在同一列上有多条记录,如下所示: | Column Header | Record1; Record2; Record3 我想问SQL中是否有任何方法可以使用分隔这些记录作为分隔符。我这样问是因为目前还不能重新创建数据库。快速解决方案- DECLARE @T TABLE ( Col NVARCHAR(2000), Col1 AS PARSENAME(REPLACE(Col, '; ', '.')
| Column Header |
Record1; Record2; Record3
我想问SQL中是否有任何方法可以使用分隔这些记录代码>作为分隔符。我这样问是因为目前还不能重新创建数据库。快速解决方案-
DECLARE @T TABLE
(
Col NVARCHAR(2000),
Col1 AS PARSENAME(REPLACE(Col, '; ', '.'), 3),
Col2 AS PARSENAME(REPLACE(Col, '; ', '.'), 2),
Col3 AS PARSENAME(REPLACE(Col, '; ', '.'), 1)
)
INSERT INTO @T (Col)
VALUES ('Record1; Record2; Record3')
SELECT * FROM @T
好的解决方案-规范化表
DECLARE @badData TABLE (id INT NOT NULL, txt NVARCHAR(max));
INSERT INTO @badData
VALUES (1, 'foo,bar,baz'), (2, NULL);;
-- the idea is to recursively 'pop' a value from the start of the string, splitting it into 'head' and 'tail' components
WITH unpacked (id, head, tail)
AS (
SELECT id, LEFT(txt, CHARINDEX(',', txt + ',') - 1), STUFF(txt, 1, CHARINDEX(',', txt + ','), '')
FROM @badData
UNION ALL
SELECT id, LEFT(tail, CHARINDEX(',', TAIL + ',') - 1), STUFF(tail, 1, CHARINDEX(',', tail+ ','), '')
FROM unpacked
WHERE tail > ''
)
SELECT id, head
FROM unpacked
ORDER BY id
严重抄袭所以,你的意思是说你希望这些记录按行分开…对吗?如果可能的话,这将是你想在其中使用的理想编程语言?这几乎每天都会在Stackoverflow上被问到,而且是这么多问题的重复。。。但是,没有一篇文章的答案比Aaron Bertrand的一系列文章提供的答案更好—[Split strings the right way–or the next best way](sqlperformance.com/2012/07/t-sql-queries/Split strings)和。感谢阅读材料!相当强的警告-限制为3个分隔符,并且不依赖于拆分的包含
的字符串。