清除将句点作为缺失值的SQL数据

时间:2017-06-15 21:17:08

标签: sql sql-server

我试图将数据从包含varchar列的表移动到带有数字列的表。下面是列中值的示例,其中有时会使用句点来表示缺失值。

    Column1
    0.00
    4.80
     .  
     .  
    0.00
     .  
    0.00
     .  

'将数据类型varchar转换为数字时出错。'到达期间时弹出。如何处理句点(删除它们或将它们更改为0.00)以便我可以继续将数据复制到新表中?

供参考,以下是我正在使用的代码:

    INSERT INTO [CORE]
       [NumberDone]
       ,[Charges]
    SELECT
       LEFT([Column0],8)
       ,LEFT([Column1],8)
    FROM [TempTbl];

3 个答案:

答案 0 :(得分:2)

您可以使用nullif()'.'变为null

insert into [core] ([NumberDone], [Charges])
select 
    left(nullif([Column0], '.'), 8)
  , left(nullif([Column1], '.'), 8)
from [TempTbl];

rextester演示:http://rextester.com/DIVNJ65404

create table TempTbl ([Column1] varchar(50));
insert into TempTbl values 
 ('0.00'),('4.80'),('.'),('.')
,('0.00'),('.'),('0.00'),('.');

select Column1 = left(nullif([Column1], '.'), 8)
from [TempTbl];

返回:

+---------+
| Column1 |
+---------+
| 0.00    |
| 4.80    |
| NULL    |
| NULL    |
| 0.00    |
| NULL    |
| 0.00    |
| NULL    |
+---------+

您可以将其包含在isnull()coalesce()中,以将null转换为0

insert into [core] ([NumberDone], [Charges])
select 
    isnull(left(nullif([Column0], '.'), 8),0)
  , isnull(left(nullif([Column1], '.'), 8),0)
from [TempTbl];

答案 1 :(得分:0)

使用类似

的内容
case when charges='.' then 0 else cast(charges as double precision) end

答案 2 :(得分:0)

如果是2012+,Try_Convert()可能会有所帮助。 Try_Convert()不仅会捕获单个小数,还会捕获任何其他意外的字符串。

示例

Declare @YourTable Table ([Column1] varchar(50))
Insert Into @YourTable Values 
 ('0.00')
,('4.80')
,('.')
,('.')
,('0.00')
,('.')
,('0.00')
,('.')

Select Try_Convert(decimal(10,2),Column1)
 from @YourTable     

<强>返回

0.00
4.80
NULL
NULL
0.00
NULL
0.00
NULL

注意:如果您更喜欢零,IsNull(Try_Convert(decimal(10,2),Column1),0)

所以,对于实际的插入

insert into [core] ([NumberDone], [Charges])
select try_convert(decimal(10,2),Column0)
     , try_convert(decimal(10,2),Column1)
from [TempTbl];