Преобразование varchar в float IF ISNUMERIC

У меня есть столбец, содержащий символы и цифры

12
13
14
19K/YR
22

Таким образом, тип столбца - varchar. Но затем я также делаю некоторые вычисления с этим столбцом, поэтому я пытаюсь преобразовать данные в float, если они являются числовыми.

Это дает мне ошибку:

SELECT CASE ISNUMERIC(QTY) 
         WHEN 1 THEN CAST(QTY AS float) 
         ELSE QTY 
       END AS test

Ответ 1

Вы не можете отличить float и сохранить строку в том же столбце. Вы можете сделать это так, чтобы получить значение null, когда isnumeric возвращает 0.

SELECT CASE ISNUMERIC(QTY) WHEN 1 THEN CAST(QTY AS float) ELSE null END

Ответ 2

.. продление ответов Микаэля

SELECT
  CASE WHEN ISNUMERIC(QTY + 'e0') = 1 THEN CAST(QTY AS float) ELSE null END AS MyFloat
  CASE WHEN ISNUMERIC(QTY + 'e0') = 0 THEN QTY ELSE null END AS MyVarchar
FROM
  ...
  • Для двух типов данных требуется два столбца
  • Добавление e0 исправляет некоторые ISNUMERIC проблемы (например, + - . и пустая строка принимается)

Ответ 3

Я нашел эту очень раздражающую ошибку при преобразовании значений EmployeeID в ISNUMERIC:

SELECT DISTINCT [EmployeeID],
ISNUMERIC(ISNULL([EmployeeID], '')) AS [IsNumericResult],

CASE WHEN COALESCE(NULLIF(tmpImport.[EmployeeID], ''), 'Z')
    LIKE '%[^0-9]%' THEN 'NonNumeric' ELSE 'Numeric'
END AS [IsDigitsResult]
FROM [MyTable]

Это возвращает:

EmployeeID IsNumericResult MyCustomResult
---------- --------------- --------------
           0               NonNumeric
00000000c  0               NonNumeric
00D026858  1               NonNumeric

(3 row(s) affected)

Надеюсь, это поможет!

Ответ 4

- ПОПРОБУЙТЕ ЭТО -

select name= case when isnumeric(empname)= 1 then 'numeric' else 'notmumeric' end from [Employees]

Но переход невозможен

select empname=
case
when isnumeric(empname)= 1 then empname
else 'notmumeric'
end
from [Employees]