【问题标题】:Removing Non-Numeric Characters from String Fail in a Scenario + MS SQL Server在场景 + MS SQL Server 中从字符串中删除非数字字符失败
【发布时间】:2019-02-01 10:05:12
【问题描述】:

我正在编写一个从 MS SQL Server 2000 到 MS SQL Server 2012 的迁移脚本,我想将 varchar 字段数据迁移到浮点数,旧数据中的一些值具有我使用下面的代码删除的非数字数据,并且它在大多数情况下都有效,除了转换失败的以下值,逻辑上 .(DOT) 是有效值,但由于多个 .DOT 它失败。

我正在考虑忽略转换失败的值,但没有发现忽略它。

列值

1.2.4

5..4

..7.5.3

SELECT Left(SubString(field, PatIndex('%[0-9.-]%', field), 8000), 
                        PatIndex('%[^0-9.-]%', SubString(field, PatIndex('%[0-9.-]%', field), 8000) + 'X')-1)

下面的 Suppress 是最终代码,运行良好

CASE WHEN (len(field) - len(replace(field, '.', '')) <= 1 AND field!='.' ) THEN
CAST(ISNULL(REPLACE(REPLACE(LEFT(SubString(field, PatIndex('%[0-9.-]%', field), 8000), 
                PatIndex('%[^0-9.-]%', SubString(field, PatIndex('%[0-9.-]%', field), 8000) + 'X')-1) ,'-',''),'..','.'),'')
                as float)
END                

【问题讨论】:

    标签: sql sql-server


    【解决方案1】:

    计算点数,如果 > 1 则抑制 (NULL)

    select case 
       when len(field) - len(replace(field, '.', '')) > 1 then null 
       else Left(..) end
    

    或者在where子句中:

    where len(field) - len(replace(field, '.', '')) <= 1
    

    【讨论】:

    • Alex,很好的答案,下面是修改后的代码,效果很好 CASE WHEN (len(field) - len(replace(field, '.', ''))
    猜你喜欢
    • 2013-06-24
    • 1970-01-01
    • 2019-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多