使用SQL

时间:2018-06-15 20:27:14

标签: sql sql-server tsql

我有一个文字RAW/+A/@B/abs.m>C,必须将其转换为A.B.C

有人可以用有效的SQL帮助我。我正在努力建立一个。

这是遵循的规则 - 使用'>'右边的内容在每个'+'或'@'之后出现的任何内容

e.g。 fixedpoint/fixedpoint/+embedded/@fi/abs.m>abs  变为embedded.fi.abs

3 个答案:

答案 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                │
└───────────────────────────────────────────────┴─────────────────────┘