我的旧数据库中有几列具有数字和字母组合在一起的值。这是我必须在新表中清理和导入的内容。需要转换的大多数值如下所示:
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
但这只会识别一个字母是否在值中。如果有人可以提供帮助,请告诉我。谢谢!
答案 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