如何|在 SQL Server 中使用管道查找和替換前兩個連字符。
例如:
“UTR-ATLAS-006-0143391-002”變成“UTR|ATLAS|006-0143391-002”
uj5u.com熱心網友回復:
在具有 regexp 函式的 RDBMS 中,這很簡單。
Postgresql 中的 Fe,通過使用帶有 2 個捕獲組和延遲搜索的正則運算式
regexp_replace(str,'^(.*?)-(.*?)-','\1|\2|')
在 Sql Server 中,沒有正則運算式函式,這有點困難。
使用 charindex 或 patindex 來定位破折號的位置
select str
, new_str = case when patindex('%-%-%', str) > 0
then stuff( stuff(str, charindex('-',str),1,'|')
,charindex('-',str,charindex('-', str) 1)
,1,'|')
else str end
from (values
('UTR-ATLAS-006-0143391-002')
, ('NO DASHES IN THIS STRING')
) test(str)
select str
, new_str = replace(left(str, charindex('-', str, charindex('-', str) 1)), '-', '|')
right(str, len(str) - charindex('-', str, charindex('-', str) 1))
from (values
('UTR-ATLAS-006-0143391-002')
, ('NO DASHES IN THIS STRING')
) test(str)
字串的解構和重構
select str
, new_str = (select stuff(string_agg(iif(rn<=2 1,'|','-') value,''),1,1,'')
from (select value, row_number() over (order by (select null)) rn from string_split(str, '-')) q )
from (values
('UTR-ATLAS-006-0143391-002')
, ('NO DASHES IN THIS STRING')
) test(str)
回傳:
| 字串 | 新字串 |
|---|---|
| UTR-ATLAS-006-0143391-002 | UTR|阿特拉斯|006-0143391-002 |
| 此字串中沒有破折號 | 此字串中沒有破折號 |
db<>在這里擺弄
uj5u.com熱心網友回復:
這是一種方法
Declare @testTable Table (TestString varchar(100));
Insert into @testTable (TestString)
Values ('UTR-ATLAS-006-0143391-002')
, ('UTR-ATLAS-006-0143392-002')
, ('UTR ATLAS 007 0143392 003');
Select tt.TestString
, updated_column = coalesce(stuff(stuff(tt.TestString, p2.pos, 1, '|'), p1.pos, 1, '|'), tt.TestString)
From @testTable tt
Cross Apply (Values (charindex('-', tt.TestString, 1))) p1(pos)
Cross Apply (Values (charindex('-', tt.TestString, p1.pos 1))) p2(pos)
uj5u.com熱心網友回復:
如果這是 DB2,你可以使用這個:
with data (str) as (values
('UTR-ATLAS-006-0143391-002')
)
select regexp_replace(
regexp_replace(str,'-','|', 1, 1),
'-','|', 1, 1
)
from data
這將首先替換第一次出現的 '-' 并再次替換第一次出現的結果,這實際上是字串中的第二次,給出:
UTR|ATLAS|006-0143391-002
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/369117.html
標籤:sql sql-server
