从表开始字符我检索值,例如,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
怎么办呢?
从表开始字符我检索值,例如,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
怎么办呢?
试试这个:
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
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('''')')
希望这会有所帮助。
我借用here的Splitter功能。您可以使用您可能已经使用的任何分隔符分析器。
测试数据:'
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
更换:
与起始标签<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
| C |
|---------------------------------|
| 7752652,7752653,7752654,7752655 |
| 7752941,7752942 |
我用CLR函数解决了这个问题。它更快速,功能可以用于复杂的查询中
public static SqlString fnRemoveSuffics(SqlString source)
{
string pattern = @":(\d+)";
string replacement = "";
string result = Regex.Replace(source.Value, pattern, replacement);
return new SqlString(result);
}
我们可以假设数字(在冒号前后)可以有不同的长度吗? – DavidG
交叉应用于分割函数,删除':'后的所有内容,然后将所有内容提供给XML PATH以重组字符串。或者只是使用CLR和正则表达式替换。 –
如果每个逗号分隔值的SQL问题都有一分钱......无论如何,“删除”是什么意思?在更新原始数据时从字段中删除,或者只选择结果中删除值的值? –