2014-07-26 73 views
3

从表开始字符我检索值,例如,T-SQL - 删除字符串从特定的字符

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

 
7752941:1,7752942:2 

即字符串可能包含子串的任何量。 我需要什么:从char':'中删除所有出现的字符到一个逗号字符。 例如,

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

应该

 
7752652,7752653,7752654,7752655 

怎么办呢?

+0

我们可以假设数字(在冒号前后)可以有不同的长度吗? – DavidG

+2

交叉应用于分割函数,删除':'后的所有内容,然后将所有内容提供给XML PATH以重组字符串。或者只是使用CLR和正则表达式替换。 –

+1

如果每个逗号分隔值的SQL问题都有一分钱......无论如何,“删除”是什么意思?在更新原始数据时从字段中删除,或者只选择结果中删除值的值? –

回答

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 
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 ('[email protected]+') select cast(t1 as varchar)+'','' from cte for xml path('''')') 
0

希望这会有所帮助。

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

  1. 解析字符串表值
  2. 使用Substring函数后删除值 ':'
  3. 用于XML来重新生成CSV

测试数据:'

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 
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 | 
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); 
}