修剪字符串直到值

时间:2018-08-16 09:13:50

标签: sql sql-server trim

我有一列具有不同大小的字符串,看起来像:

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'

但是我把它弄混了,有时候我会在逗号后得到一些值,但是不完整。

有什么想法吗?

谢谢,谢谢。

2 个答案:

答案 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没有很好的字符串处理功能。相反,您应该使用联结/关联表。