【问题标题】:How to determine the field value which can not convert to (decimal, float,int) in SQL Server如何确定 SQL Server 中不能转换为(十进制、浮点、整数)的字段值
【发布时间】:2015-04-28 21:25:15
【问题描述】:

我有一个 SQL Server 数据库。

一个字段的值类似于

 ID      VALUE
  1      NEGATIF
  2      11.4
  3      0.2
  4      A RH(+)
  5      -----
  6      >>>>>
  7      5.6<
  8      -13.9

我想将 VALUE 字段转换为十进制,当然是可转换字段。

  1. 什么样的 SQL 语句可以做到这一点?

  2. 如何了解转换时哪个值引发错误?

PS:我认为这可以解决WHERE VALUE LIKE '[a-z]' 但我怎样才能添加更多过滤器,如 [-+ ()] ?

【问题讨论】:

    标签: sql-server tsql casting


    【解决方案1】:

    简单的 ISNUMERIC 是垃圾

    • 空字符串,+-。都是有效的
    • +. 等也是如此
    • 1e-3 对浮点数有效,但对十进制无效(除非您将浮点数转换为十进制)

    对于一个特别神秘但故障安全的解决方案,附加 e0.0e0 然后使用 ISNUMERIC

    SELECT
       ISNUMERIC(MyCOl + 'e0')   --decimal check,
       ISNUMERIC(MyCOl + '.0e0')  --integer check
    

    所以

    SELECT
        ID, VALUE,
        CAST(
              CASE WHEN ISNUMERIC(VALUE + 'e0') = 1 THEN VALUE ELSE NULL END
              AS decimal(38, 10)
            ) AS ConvertedVALUE
    FROM
        Mytable
    

    【讨论】:

    • 以防万一其他人发现这个巧妙的技巧 - 整数检查实际上应该添加 '.e0' 而不是 '.0e0'。否则,如果您正在测试的值是单个 + 或 - 字符 isnumeric() 仍将返回 true。
    • @Peter,你实际上需要这样的东西来处理一个字符的情况: CAST(CASE WHEN(Value) = 1 AND ISNUMERIC(VALUE + '.e0') = 1 THEN VALUE WHEN LEN (值) > 1 AND ISNUMERIC(Value + '.0e0') = 1 THEN VALUE ELSE NULL END AS INT)
    • @EstebanBrenes - 很好的收获。显然是我不够重视。我认为就我而言,我只关心它是否是一个数字,而不关心它是整数还是小数。
    • @Peter +1 for .e0 排除“+”、“-”和“”
    猜你喜欢
    • 1970-01-01
    • 2013-04-18
    • 2014-03-01
    • 2019-07-20
    • 1970-01-01
    • 2020-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多