检索值,例如
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
怎么做?
答案 0 :(得分:2)
将:
替换为开始标记<X>
将,
替换为结束标记</X>
和一个额外的逗号
在末尾</X>
添加额外的结束标记。
这会给你一个看起来像7752941<X>1</X>,7752942<X>2</X>
的字符串。
转换为XML并使用query(text())
获取根文本值
将结果转换回字符串。
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功能。您可以使用您可能已经使用的任何分隔符解析器。
测试数据:&#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);
}