如何修剪/替换值中的任何字母?

时间:2017-09-18 16:18:59

标签: sql sql-server-2008

我的旧数据库中有几列具有数字和字母组合在一起的值。这是我必须在新表中清理和导入的内容。需要转换的大多数值如下所示:

40M or 85M or NR or 5NR ...

由于没有任何验证用户可以在旧系统中输入什么,因此仍然可以存在如下值:40A或3R等。我想在我的新表中仅导入数值。因此,如果值中有任何字母,我想修剪它们。在SQL Server中执行此操作的最佳方法是什么?我试过这个:

CASE WHEN CHARINDEX('M',hs_ptr1) <> 0 THEN 1 ELSE 0 END AS hs_ptr1

但这只会识别一个字母是否在值中。如果有人可以提供帮助,请告诉我。谢谢!

3 个答案:

答案 0 :(得分:1)

您可以使用patindex搜索模式。试试这段代码:

<强>代码:

CREATE TABLE #temp
(
      TXT NVARCHAR(50)
)

INSERT INTO #temp (TXT)
VALUES 
    ('40M'),
    ('85M'),
    ('NR'),
    ('5NR')

SELECT LEFT(subsrt, PATINDEX('%[^0-9]%', subsrt + 't') - 1) 
FROM (
    SELECT subsrt = SUBSTRING(TXT, pos, LEN(TXT))
    FROM (
        SELECT TXT, pos = PATINDEX('%[0-9]%', TXT)
        FROM #temp
    ) d
) t

DROP TABLE #temp

答案 1 :(得分:1)

这是一种没有功能的方式......

declare @table table (c varchar(256))
insert into @table
values
('40M'),
('30'),
('5NR'),
('3(-4_')

select
replace(LEFT(SUBSTRING(replace(replace(replace(replace(replace(c,'(',''),')',''),'-',''),' ',''),',',''), PATINDEX('%[0-9.-]%', replace(replace(replace(replace(replace(c,'(',''),')',''),'-',''),' ',''),',','')), 8000),
           PATINDEX('%[^0-9.-]%', SUBSTRING(replace(replace(replace(replace(replace(c,'(',''),')',''),'-',''),' ',''),',',''), PATINDEX('%[0-9.-]%', replace(replace(replace(replace(replace(c,'(',''),')',''),'-',''),' ',''),',','')), 8000) + 'X') -1),'.','')
from @table

答案 2 :(得分:0)

您使用PATINDEX function并搜索不是数字的字符。如果存在这样的索引,则抓住它左侧的所有内容。这样的事情:

SELECT LEFT(your_field_name, PATINDEX("%[^0-9]%", your_field_name) - 1)
FROM your_table_name

更新

嗯,你需要处理任何边缘情况。例如。如果没有非数字数据,函数将返回0,因此计算得到-1,实际上,它是无效长度。

我建议您利用Common Table Expression计算非数字数据的索引,然后构造IIF expression以选择正确的char数据。 E.g。

WITH cte AS 
(
    SELECT *, PATINDEX("%[^0-9]%", your_field_name) AS NumLength
    FROM your_table_name
)
SELECT any_other_field, IIF(NumLength = 0, 
    your_field_name, 
    LEFT(your_field_name, PATINDEX("%[^0-9]%", your_field_name) - 1)
)
FROM cte