如何确定SQL Server中无法转换为(decimal,float,int)的字段值

uza*_*y95 15 t-sql sql-server casting

我有一个SQL Server数据库.

一个字段具有类似的值

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

我想将CONVERT VALUE字段转换为十进制,当然还有可转换字段.

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

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

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

gbn*_*gbn 65

普通的ISNUMERIC是垃圾

  • 空字符串+,-. are all valid
  • So is +.
  • 1e-3 对于float而不是十进制有效(除非你CAST浮动然后到十进制)

对于特别隐蔽但故障保护溶液,附加e0.0e0 然后使用ISNUMERIC

SELECT
   ISNUMERIC(MyCOl + 'e0')   --decimal check,
   ISNUMERIC(MyCOl + '.0e0')  --integer check
Run Code Online (Sandbox Code Playgroud)

所以

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

  • 以防万一其他人发现这个巧妙的技巧 - 整数检查实际上应该添加'.e0'而不是'.0e0'.否则,如果您要测试的值是单个+或 - 字符,则isnumeric()仍将返回true. (5认同)