用不同的字符分隔 sql
Separate with different characters sql
所以我有一列包含多个不同的字符串。如果字符串包含 _ ,则必须根据该字符拆分它。对于我使用的其他规则,我会使用单独的规则,例如:如果它以 4FH、GWO、CTW 开头并且没有 _,则它必须在 3 个字符后拆分。如果它以 4 开头并且没有 _.. 等..
Example
|Source |
|EC_HKT |
|4FHHTK |
|ABC_GJE |
|4SHARED |
|ETK_ETK-40|
etc..
我想要的结果是
|Source|Instance|
|EC |HKT |
|4FH |HTK |
|ABC |GJE |
|4 |SHARED |
|ETK |40 |
作为开始,我首先尝试了
SELECT
LEFT(lr.Source, CHARINDEX('_',lr.Source)) AS Source,
RIGHT(lr.Source, LEN(lr.Source) - CHARINDEX('_', lr.Source)) AS Interface,
但这只有在所有结果都有一个 _ 时才有效。任何提示或想法? CASE WHEN THEN 有效吗?
要按照不同的规则拆分,请使用 CASE
表达式。 (W3Schools)
SELECT CASE
WHEN lr.Source LIKE '4FH%' AND CHARINDEX('_', lr.Source) = 0
THEN LEFT(lr.Source, 3)
...
END as Source
如果这些是单独的列,那么您需要为每一列提供一个案例陈述。
这需要一点创造力,而且无疑比我在这里所做的工作更多,但是这至少为您提供了一种模式,可以根据需要使用和增强。
下面使用一个简单的函数来应用示例数据中的基本规则来导出拆分字符串的点,再加上一些额外的字符删除和源部分的删除(如果它也存在于实例部分中)。
如果有多个“规则”匹配,则使用匹配字符数较多的那个。
函数:
create or alter function splitpos(@string varchar(50))
returns table as
return
(
with map as (
select * from (values ('4FH'),('GWO'),('CTW'),('4'))m(v)
)
select IsNull(NullIf(CharIndex('_',@string),0)-1,Max(Len(m.v))) pos
from map m
where @string like m.v + '%'
)
查询:
select l.v source, Replace(Replace(Replace(Stuff(source,1,pos,''),'_',''),'-',''),l.v,'') instance
from t
cross apply dbo.splitpos(t.source)
cross apply (values(Left(source,pos)))l(v)
所以我有一列包含多个不同的字符串。如果字符串包含 _ ,则必须根据该字符拆分它。对于我使用的其他规则,我会使用单独的规则,例如:如果它以 4FH、GWO、CTW 开头并且没有 _,则它必须在 3 个字符后拆分。如果它以 4 开头并且没有 _.. 等..
Example
|Source |
|EC_HKT |
|4FHHTK |
|ABC_GJE |
|4SHARED |
|ETK_ETK-40|
etc..
我想要的结果是
|Source|Instance|
|EC |HKT |
|4FH |HTK |
|ABC |GJE |
|4 |SHARED |
|ETK |40 |
作为开始,我首先尝试了
SELECT
LEFT(lr.Source, CHARINDEX('_',lr.Source)) AS Source,
RIGHT(lr.Source, LEN(lr.Source) - CHARINDEX('_', lr.Source)) AS Interface,
但这只有在所有结果都有一个 _ 时才有效。任何提示或想法? CASE WHEN THEN 有效吗?
要按照不同的规则拆分,请使用 CASE
表达式。 (W3Schools)
SELECT CASE
WHEN lr.Source LIKE '4FH%' AND CHARINDEX('_', lr.Source) = 0
THEN LEFT(lr.Source, 3)
...
END as Source
如果这些是单独的列,那么您需要为每一列提供一个案例陈述。
这需要一点创造力,而且无疑比我在这里所做的工作更多,但是这至少为您提供了一种模式,可以根据需要使用和增强。
下面使用一个简单的函数来应用示例数据中的基本规则来导出拆分字符串的点,再加上一些额外的字符删除和源部分的删除(如果它也存在于实例部分中)。
如果有多个“规则”匹配,则使用匹配字符数较多的那个。
函数:
create or alter function splitpos(@string varchar(50))
returns table as
return
(
with map as (
select * from (values ('4FH'),('GWO'),('CTW'),('4'))m(v)
)
select IsNull(NullIf(CharIndex('_',@string),0)-1,Max(Len(m.v))) pos
from map m
where @string like m.v + '%'
)
查询:
select l.v source, Replace(Replace(Replace(Stuff(source,1,pos,''),'_',''),'-',''),l.v,'') instance
from t
cross apply dbo.splitpos(t.source)
cross apply (values(Left(source,pos)))l(v)