T-SQL - 从特定字符开始的字符串中删除字符

时间:2014-07-26 11:25:54

标签: sql sql-server tsql

表I中的

检索值,例如

7752652:1,7752653:2,7752654:3,7752655:4

7752941:1,7752942:2

即。 string可以包含任意数量的子串。 我需要的是:从char'中删除所有出现的字符:'到逗号字符。 例如,

7752652:1,7752653:2,7752654:3,7752655:4

应该是

7752652,7752653,7752654,7752655

怎么做?

5 个答案:

答案 0 :(得分:2)

:替换为开始标记<X>,替换为结束标记</X>和一个额外的逗号 在末尾</X>添加额外的结束标记。

这会给你一个看起来像7752941<X>1</X>,7752942<X>2</X>的字符串。

转换为XML并使用query(text())获取根文本值 将结果转换回字符串。

SQL Fiddle

MS SQL Server 2012架构设置

create table T
(
  C varchar(100)
)

insert into T values
('7752652:1,7752653:2,7752654:3,7752655:4'),
('7752941:1,7752942:2')

查询1

select cast(cast(replace(replace(T.C, ':', '<X>'), ',', '</X>,')+'</X>' as xml).query('text()') as varchar(100)) as C
from T

<强> Results

|                               C |
|---------------------------------|
| 7752652,7752653,7752654,7752655 |
|                 7752941,7752942 |

答案 1 :(得分:1)

declare @query varchar(8000)
select @query= 'select '+ replace (
            replace('7752652:1,7752653:2,7752654:3,7752655:4',',',' t union all select ')
            ,':',' t1 , ')
exec(';with cte as ( '+@query+' ) select cast(t1 as varchar)+'','' from cte for xml path('''')')

答案 2 :(得分:0)

试试这个:

DECLARE @Data VARCHAR(100) = '7752652:1,7752653:2,7752654:3,7752655:4'
DECLARE @Output VARCHAR(100) = ''

WHILE CHARINDEX(':', @Data) > 0
BEGIN
    IF LEN(@Output) > 0 SET @Output = @Output + ','
    SET @Output = @Output + LEFT(@Data, CHARINDEX(':', @Data)-1)

    SET @Data = STUFF(@Data, 
                      1,  
                      (CASE CHARINDEX(',', @Data) 
                            WHEN 0 THEN LEN(@Data) 
                            ELSE CHARINDEX(',', @Data) 
                            END) - CHARINDEX(':', @Data),
                       '')
END

SELECT @Output AS Result -- 7752652,7752653,7752654,7752655

答案 3 :(得分:0)

希望这会有所帮助。

我从here借用了Splitter功能。您可以使用您可能已经使用的任何分隔符解析器。

  1. 将字符串解析为表值
  2. 使用子字符串功能删除&#39;之后的值:&#39;
  3. 使用For xml重新生成CSV
  4. 测试数据:&#39;

    IF OBJECT_ID(N'tempdb..#temp')>0
    DROP TABLE #temp
    
    CREATE TABLE #temp (id int, StringCSV VARCHAR(500))
    INSERT INTO #temp VALUES ('1','7752652:1,7752653:2,7752654:3,7752655:4')
    INSERT INTO #temp VALUES ('2','7752656:1,7752657:3,7752658:4')
    INSERT INTO #temp VALUES ('3','7752659:1,7752660:2')
    SELECT * FROM #temp t
    

    主要查询:

    ;WITH cte_Remove(ID, REMOVE) AS 
    (
        SELECT   y.id   AS ID,
                 SUBSTRING(fn.string, 1, CHARINDEX(':', fn.string) -1) AS Removed
        FROM     #temp  AS y
        CROSS APPLY dbo.fnParseStringTSQL(y.StringCSV, ',') AS fn
    )
    SELECT   DISTINCT ID,
             STUFF(
                    (
                     SELECT  ',' + REMOVE
                     FROM    cte_Remove AS t2
                     WHERE   t2.ID = t1.ID
                             FOR XML PATH('')
                    ),1,1,'') AS col2
    FROM     cte_Remove  AS t1
    

    清理测试数据:

    IF OBJECT_ID(N'tempdb..#temp') > 0
        DROP TABLE #temp
    

答案 4 :(得分:0)

我用CLR功能解决了这个问题。它更快,功能可用于复杂查询

public static SqlString fnRemoveSuffics(SqlString source)
{
    string pattern = @":(\d+)";
    string replacement = "";
    string result = Regex.Replace(source.Value, pattern, replacement);

    return new SqlString(result);
}