Mic*_*l A 5 sql t-sql sql-server-2008
我目前正在进行数据转换项目,需要从字符串中删除所有字母字符.不幸的是我无法创建或使用函数,因为我们没有拥有源机器,因为我发现从搜索以前的帖子无法使用的方法.
在select语句中执行此操作的最佳方法是什么?速度不是太大的问题,因为这只会运行超过30,000条记录,并且是一次性的声明.
Ric*_*iwi 13
您可以在一个声明中执行此操作.你真的不是用200+ REPLACE创建一个声明了吗?!
update tbl
set S = U.clean
from tbl
cross apply
(
select Substring(tbl.S,v.number,1)
-- this table will cater for strings up to length 2047
from master..spt_values v
where v.type='P' and v.number between 1 and len(tbl.S)
and Substring(tbl.S,v.number,1) like '[0-9]'
order by v.number
for xml path ('')
) U(clean)
Run Code Online (Sandbox Code Playgroud)
使用SQL Fiddle显示带有示例数据的查询
下面复制后人:
create table tbl (ID int identity, S varchar(500))
insert tbl select 'asdlfj;390312hr9fasd9uhf012 3or h239ur ' + char(13) + 'asdfasf'
insert tbl select '123'
insert tbl select ''
insert tbl select null
insert tbl select '123 a 124'
Run Code Online (Sandbox Code Playgroud)
结果
ID S
1 390312990123239
2 123
3 (null)
4 (null)
5 123124
Run Code Online (Sandbox Code Playgroud)
CTE来自HELP.
;WITH CTE AS
(
SELECT
[ProductNumber] AS OrigProductNumber
,CAST([ProductNumber] AS VARCHAR(100)) AS [ProductNumber]
FROM [AdventureWorks].[Production].[Product]
UNION ALL
SELECT OrigProductNumber
,CAST(STUFF([ProductNumber], PATINDEX('%[^0-9]%', [ProductNumber]), 1, '') AS VARCHAR(100) ) AS [ProductNumber]
FROM CTE WHERE PATINDEX('%[^0-9]%', [ProductNumber]) > 0
)
SELECT * FROM CTE
WHERE PATINDEX('%[^0-9]%', [ProductNumber]) = 0
OPTION (MAXRECURSION 0)
Run Code Online (Sandbox Code Playgroud)
输出:
OrigProductNumber ProductNumber
WB-H098 098
VE-C304-S 304
VE-C304-M 304
VE-C304-L 304
TT-T092 092
Run Code Online (Sandbox Code Playgroud)
RichardTheKiwi 在函数中的脚本用于在没有交叉应用的情况下进行选择,还添加了点,因为在我的例子中,我将它用于 varchar 字段中的 double 和 Money 值
CREATE FUNCTION dbo.ReplaceNonNumericChars (@string VARCHAR(5000))
RETURNS VARCHAR(1000)
AS
BEGIN
SET @string = REPLACE(@string, ',', '.')
SET @string = (SELECT SUBSTRING(@string, v.number, 1)
FROM master..spt_values v
WHERE v.type = 'P'
AND v.number BETWEEN 1 AND LEN(@string)
AND (SUBSTRING(@string, v.number, 1) LIKE '[0-9]'
OR SUBSTRING(@string, v.number, 1) LIKE '[.]')
ORDER BY v.number
FOR
XML PATH('')
)
RETURN @string
END
GO
Run Code Online (Sandbox Code Playgroud)
谢谢理查德TheKiwi +1