首页 > 解决方案 > 在多个替换和子字符串中将字段转换为十进制

问题描述

我正在尝试将客户数据从旧供应商导入到我们的数据库 - 之前的供应商是一个 varchar(10) 字段,我在其中看到了诸如“)”、“(”和“-”之类的字符。

我正在尝试导入我们的表,该表将电话号码存储在两列中 - phone1AreaCode 和 phone1Number。phone1AreaCode 是 decimal(3,0) 数据类型,phone1Number 是 decimal(7,0)。

我尝试了各种将子字符串转换或转换为小数的方法,但我一直遇到错误。

这是我在 SELECT 中工作但在尝试插入时失败的内容:

REPLACE(REPLACE(REPLACE(REPLACE(SUBSTRING(PHONE,1,3),'(',''),')',''),'-',''),' ','') AS phone1AreaCode,
REPLACE(REPLACE(REPLACE(REPLACE(SUBSTRING(PHONE,4,7),'(',''),')',''),'-',''),' ','') AS phone1Number ,

错误:

Error converting data type varchar to numeric.

我尝试了 CAST 或 CONVERT 的各种位置,但它们都给了我同样的错误:

Argument data type decimal is invalid for argument 1 of substring function.

尝试失败:

REPLACE(REPLACE(REPLACE(REPLACE(SUBSTRING(CAST(PHONE AS DECIMAL(3,0)),1,3),'(',''),')',''),'-',''),' ','') AS phone1AreaCode,

从谷歌搜索,看起来可能 SUBSTRING 无法处理十进制数据类型。如果这是真的,我该如何解决这个问题?

标签: tsqlsubstringsql-server-2016data-conversion

解决方案


我能够通过首先将字段转换为 INT 然后将其转换为 DECIMAL 来解决此问题:

CASE
    WHEN s.PHONE IS NULL OR s.PHONE = '' THEN NULL
    ELSE CONVERT(DECIMAL(3,0),CONVERT(INT,REPLACE(REPLACE(REPLACE(REPLACE(SUBSTRING(PHONE,1,3),'(',''),')',''),'-',''),' ','')))
END AS phone1AreaCode,

CASE
    WHEN s.PHONE IS NULL OR s.PHONE = '' THEN NULL
    ELSE CONVERT(DECIMAL(7,0),CONVERT(INT,REPLACE(REPLACE(REPLACE(REPLACE(SUBSTRING(PHONE,4,7),'(',''),')',''),'-',''),' ','')))
END AS phone1Number,

推荐阅读