所以我有一個包含多個不同字串的列。如果字串包含一個_,就必須在這個字符上進行分割。對于其他的,我將使用一個單獨的規則,比如。如果它以4FH、GWO、CTW開頭,并且沒有_,那么它必須在3個字符之后被分割。如果它以4開頭并且沒有_......等等。
Example
|Source |
|EC_HKT |
|4FHHTK |
|ABC_GJE |
|4SHARED |
|ETK_ETK-40|
等。
我想要的結果是
|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('_'/span>, lr.Source) AS介面。
但是這只有在所有的結果都有_的情況下才會起作用。有什么提示或想法嗎?一個CASE WHEN THEN可以嗎?
uj5u.com熱心網友回復:
要用不同的規則分割,請使用CASE 運算式。(W3Schools)
SELECT CASE
WHEN lr.Source LIKE '4FH%' AND CHARINDEX('_', lr. Source) = 0.
THEN LEFT(lr.Source, 3)
...
END as Source
如果這些論文是獨立的列,那么你需要為每一列設定一個case陳述句。
uj5u.com熱心網友回復:
這需要一點創造力,而且無疑比我在這里所做的作業更多,然而這至少給了你一個模式來作業,并根據需要進行改進。
下面使用一個簡單的函式,從你的樣本資料中應用基本規則,以得出分割你的字串的點,再加上一些額外的洗掉字符,以及洗掉源部分(如果它也存在于實體部分)。
如果有多個 "規則 "匹配,它將使用匹配字符數較多的那個。
功能:
創建 或 alter function splitpos(@string varchar(50)
returns table as
return return
(
with map as (
select * from (values ('4FH'), ('GWO'), ('CTW'), ('4') m(v)
)
select IsNull(NullIf(CharIndex('_'/span>, @string),0)-1,Max(Len(m.v) v))) pos
from map m
where @string like m.v '%'/span>
)
查詢:
select l. v source, Replace(替換(Stuff(source,1,pos,''), '_',''),'-',''),l. v,'')實體
from t
cross apply dbo.splitpos(t.source)
cross apply (values(Left(source,pos)) l(v)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/307278.html
標籤:
