Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 从字符串中删除非数字字符_Sql_Sql Server 2008_Tsql - Fatal编程技术网

Sql 从字符串中删除非数字字符

Sql 从字符串中删除非数字字符,sql,sql-server-2008,tsql,Sql,Sql Server 2008,Tsql,我目前正在做一个数据转换项目,需要从字符串中删除所有字母字符。不幸的是,我不能创建或使用一个函数,因为我们没有自己的源计算机,使得我在搜索以前文章时发现的方法无法使用 在select语句中执行此操作的最佳方法是什么?速度不是一个太大的问题,因为这只会运行30000条左右的记录,而且是一个一次性语句。如果你真的不能使用函数,我想你可以这样做: SELECT REPLACE(REPLACE(REPLACE(LOWER(col),'a',''),'b',''),'c','') FROM dbo.t

我目前正在做一个数据转换项目,需要从字符串中删除所有字母字符。不幸的是,我不能创建或使用一个函数,因为我们没有自己的源计算机,使得我在搜索以前文章时发现的方法无法使用


在select语句中执行此操作的最佳方法是什么?速度不是一个太大的问题,因为这只会运行30000条左右的记录,而且是一个一次性语句。

如果你真的不能使用函数,我想你可以这样做:

SELECT REPLACE(REPLACE(REPLACE(LOWER(col),'a',''),'b',''),'c','')
  FROM dbo.table...

显然,这比那要难看得多,因为我只处理了前三封信,但它应该给出了想法。

你可以用一句话来表达。你不是真的用200多个替换来创建一个语句,是吗

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)
正在使用示例数据显示此查询

为子孙后代复制如下:

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'
结果

ID  S
1   390312990123239
2   123
3   (null)
4   (null)
5   123124

CTE来这里寻求帮助

;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)
输出:

OrigProductNumber   ProductNumber
WB-H098                 098
VE-C304-S               304
VE-C304-M               304
VE-C304-L               304
TT-T092                 092

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

谢谢RichardTheKiwi+1

是的。。。结果就是这样。同意这是丑陋的想法,T-SQL函数不会那么漂亮,只是在查询中看起来更好。另一方面,CLR会让你在正则表达式中做这类事情更整洁。我完全同意时间敏感的项目:)@Aaron,@Michael我认为更简洁的TSQL解决方案仍然是可能的。。。如果字符串中有外来字符或不确定,这个答案必须包括
REPLACE(..,Char(244),“”)
etc+1,比我的更聪明,但如果只需要替换字母字符,则嵌套的替换更容易理解。:-)你说得对。我以前用过这个模式来清理某些字符组(不同的WHERE子句),所以我想我应该重用它。+1太棒了!您拥有迄今为止最好的脚本,目前已测试了20多个脚本—所有其他脚本要么不受SQL 2005标准支持,要么速度非常慢。