我有一列具有不同大小的字符串,看起来像:
abcd, efgh, ijkl2, 2345, xyzw
我需要将其修剪成2个不同的列,并从右边获取逗号之前的字符串,然后再获取另一个,所以我将在其他2列中添加:
2345 xyz
我试图只在第一个逗号之前得到字符串的第一部分:
RTRIM(LTRIM(RIGHT(A.[column],charindex(',',A.[column]+',')-1))) as 'aa'
RIGHT(A.[column], len(A.[column]) - charindex(',',A.[column])) as 'ab'
但是我把它弄混了,有时候我会在逗号后得到一些值,但是不完整。
有什么想法吗?
谢谢,谢谢。
答案 0 :(得分:0)
如果您是一个SQL Server 2016,则可以使用string_split ...
尝试类似这样的东西:
drop TABLE REC.TestTable;
CREATE TABLE REC.TestTable (id int identity, --Avoid using keywords for column names
str varchar(500));
GO
INSERT INTO REC.TestTable (str)
VALUES ('abcd, efgh, ijkl2, 123, ijk'),
('abcd, efgh, ijkl2, 4567, lmn'),
('abcd, efgh, ijkl2, 89, opqr')
;
GO
with tmp as (
select f1.*, f2.value, row_number() over(partition by id order by (select null)) position
from REC.TestTable f1 cross apply STRING_SPLIT(str, ',') f2
)
select f1.*, f2.value ValPos1, f3.value ValPos2, f4.value ValPos3, f5.value ValPos4, f6.value ValPos5
from REC.TestTable f1
left outer join tmp f2 on f1.id=f2.id and f2.position =1
left outer join tmp f3 on f1.id=f3.id and f3.position =2
left outer join tmp f4 on f1.id=f4.id and f4.position =3
left outer join tmp f5 on f1.id=f5.id and f5.position =4
left outer join tmp f6 on f1.id=f6.id and f6.position =5
答案 1 :(得分:0)
SQL Server中的此类字符串函数确实很痛苦。我喜欢将apply
用于此类操作,因为这样可以更轻松地保留中间结果。
针对此特定问题:
select v.str, v2.lastval, v3.secondlastval
from (values ('abcd, efgh, ijkl2, 2345, xyzw')) v(str) cross apply
(select stuff(str, 1, len(str) - charindex(',', reverse(str)) + 2, ''),
stuff(str, len(str) - charindex(',', reverse(str)) + 1, len(str), '')
) v2(lastval, rest) cross apply
(select stuff(v2.rest, 1, len(v2.rest) - charindex(',', reverse(v2.rest)) + 2, ''),
stuff(v2.rest, len(v2.rest) - charindex(',', reverse(v2.rest)) + 1, len(v2.rest), '')
) v3(secondlastval, rest);
话虽如此,您可能应该重新考虑您的数据结构。在SQL中,用分隔字符串存储值列表是一种不良的数据结构,因为SQL没有很好的字符串处理功能。相反,您应该使用联结/关联表。