我的列 [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
怎么做?
答案 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)
正如我在评论中提到的,我猜 SQLS
和 SQ
属于下一个信息,而不是排序规则。但是,如果您想要“整理后的所有内容”,则必须稍微修改您的查询:
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)