T-SQL 正则表达式 :: 删除某个符号之前的所有内容

时间:2021-05-10 10:14:43

标签: sql sql-server regex tsql

我的列 [Status] 中的值以这种方式表示:

Status=ONLINE, Updateability=READ_WRITE, UserAccess=MULTI_USER, Recovery=FULL, Version=782, Collation=Latin1_General_CI_AS, SQLS
Status=ONLINE, Updateability=READ_WRITE, UserAccess=MULTI_USER, Recovery=SIMPLE, Version=782, Collation=Latin1_General_CI_AS, SQ
Status=ONLINE, Updateability=READ_WRITE, UserAccess=MULTI_USER, Recovery=SIMPLE, Version=706, Collation=Latin1_General_CI_AS, SQ

我只想选择 Collation= 之后的所有内容

所以我使用:

SELECT right([Status], len([Status]) - charindex('=', [Status]))
FROM MyDatabase

但是这样结果就是第一个 = 之后的所有内容,我有这个:

ONLINE, Updateability=READ_WRITE, UserAccess=MULTI_USER, Recovery=FULL, Version=782, Collation=Latin1_General_CI_AS, SQLS
ONLINE, Updateability=READ_WRITE, UserAccess=MULTI_USER, Recovery=SIMPLE, Version=782, Collation=Latin1_General_CI_AS, SQ
ONLINE, Updateability=READ_WRITE, UserAccess=MULTI_USER, Recovery=SIMPLE, Version=706, Collation=Latin1_General_CI_AS, SQ

但我想在最后一个 = 之后拥有一切:

Latin1_General_CI_AS, SQLS
Latin1_General_CI_AS, SQ
Latin1_General_CI_AS, SQ

怎么做?

2 个答案:

答案 0 :(得分:4)

如果您想要最后一个 = 之后的所有内容,您可以简单地使用:

select t.*, 
       right(t.status, charindex('=', reverse(t.status)) - 1)
from t ;

如果你想让“参数”变成“排序规则”,最简单的方法大概是string_split()

select t.*, c.collation
from t outer apply
     (select s2.value as collation
      from string_split(t.status, ',') s cross apply
           string_spit(s.value, '=') s2
      where trim(s.value) like 'Collation%'
     ) c;

Here 是一个 db<>fiddle。

答案 1 :(得分:0)

正如我在评论中提到的,我猜 SQLSSQ 属于下一个信息,而不是排序规则。但是,如果您想要“整理后的所有内容”,则必须稍微修改您的查询:

DECLARE @x nvarchar(200) = 'Status=ONLINE, Updateability=READ_WRITE, UserAccess=MULTI_USER, Recovery=FULL, Version=782, Collation=Latin1_General_CI_AS, SQLS'
SELECT right(@x, len(@x) - charindex('Collation=', @x) - 9)