我有一个文字RAW/+A/@B/abs.m>C
,必须将其转换为A.B.C
有人可以用有效的SQL帮助我。我正在努力建立一个。
这是遵循的规则 - 使用'>'右边的内容在每个'+'或'@'之后出现的任何内容
e.g。 fixedpoint/fixedpoint/+embedded/@fi/abs.m>abs
变为embedded.fi.abs
答案 0 :(得分:1)
如果您只有每个特殊字符+ @ >
的一个实例,则以下内容将起作用。
declare @table table (c1 varchar(64))
insert into @table
values
('RAW/+A/@B/abs.m>C '),
('fixedpoint/fixedpoint/+embedded/@fi/abs.m>abs')
;with cte as(
select
fst = substring(c1,charindex('+',c1) + 1,charindex('/',substring(c1,charindex('+',c1) + 1,8000)) - 1)
,mid = substring(c1,charindex('@',c1) + 1,charindex('/',substring(c1,charindex('@',c1) + 1,8000)) - 1)
,lst = substring(c1,charindex('>',c1) + 1,8000)
from
@table)
select
fst + '.' + mid + '.' + lst
from cte
答案 1 :(得分:0)
虽然我确定您有其他变体,但这足以满足您的示例:
;WITH CTE (Column1) AS (
SELECT * FROM (
VALUES
('RAW/+A/@B/abs.m>C')
) AS A (Column1)
)
SELECT SUBSTRING(Column1, CHARINDEX('+', Column1) + 1, 1) + '.' +
SUBSTRING(Column1, CHARINDEX('@', Column1) + 1, 1) + '.' +
SUBSTRING(Column1, CHARINDEX('>', Column1) + 1, 1) AS Result
FROM CTE
假设每个特殊字符中只有一个,并且每个“查找”字符中只有一个。
答案 2 :(得分:0)
使用递归CTE的PoC:
WITH cte AS (
SELECT id
,orig = c
,result = CAST('' AS VARCHAR(MAX))
,i = PATINDEX('%[+@>]%', c)
,s = c
FROM tab
UNION ALL
SELECT c.id,
c.orig,
c.result+'.'+CAST(LEFT(sub.z,IIF(PATINDEX('%[/]%',sub.z)-1 < 0, LEN(c.s),
PATINDEX('%[/]%',sub.z)-1)) AS VARCHAR(MAX)),
PATINDEX('%[+@>]%', sub.z),
sub.z
FROM cte c
CROSS APPLY (VALUES (SUBSTRING(c.s, i+1, LEN(c.s)))) AS sub(z)
WHERE PATINDEX('%[+@>]%', c.s) <> 0
)
SELECT TOP 1 WITH TIES orig, STUFF(result,1,1,'') AS f
FROM cte
ORDER BY ROW_NUMBER() OVER(PARTITION BY id ORDER BY LEN(result) DESC);
<强> DBFiddle Demo 强>
输出:
┌───────────────────────────────────────────────┬─────────────────────┐
│ orig │ f │
├───────────────────────────────────────────────┼─────────────────────┤
│ RAW/+A/@B/abs.m>C │ A.B.C │
│ fixedpoint/fixedpoint/+embedded/@fi/abs.m>abs │ embedded.fi.abs │
│ fasfasfds/@ABC/asdsa/+eqwe/@afdsda/asdsa>XYZ │ ABC.eqwe.afdsda.XYZ │
│ some_text │ null │
└───────────────────────────────────────────────┴─────────────────────┘