SQL Server преобразует переменное поле varchar в деньги / десятичное число / что-то с десятичными знаками - PullRequest
2 голосов
/ 13 октября 2009

Я ищу элегантный способ преобразования поля типа varchar с переменными данными в тип данных, который можно использовать для выборки данных математических операций из поля. (без кавычек)

''
'abc'
'23'
'23.2'

Метод должен работать для всех, а для первого и второго значения должны возвращать 0, а не выдавать ошибку SQL Server.

Ответы [ 5 ]

3 голосов
/ 13 октября 2009

Попробуйте это:

SELECT CASE WHEN IsNumeric(YourColumn) = 0 THEN 
           0 
       ELSE 
           CAST(YourColumn AS decimal(18, 2)) 
       END

Вы должны настроить тип данных назначения, я выбрал десятичную (18, 2) для демонстрации.

1 голос
/ 09 января 2014

Я знаю, что это давно мертвая тема, но недавно я наткнулся на нее из поиска в Google и подумал. Это менее элегантно, чем оператор CASE, но это альтернатива.

SELECT
    COALESCE(CAST(NULLIF(ISNUMERIC(LEFT(MyColumn, PATINDEX('% %', MyColumn + ' ') - 1)), 1) AS MONEY), LEFT(MyColumn, PATINDEX('% %', MyColumn + ' ') - 1))
FROM
    myTable

или вы можете сделать:

Select COALESCE(CAST(NULLIF(ISNUMERIC(MyColumn), 1) AS MONEY), MyColumn)
FROM
    myTable

В верхней версии «2 5» будет отображаться как 2, а в нижней - в виде текстового поля.

0 голосов
/ 30 июля 2017

COALESCE является отличным вариантом для этого: здесь можно найти дополнительную информацию . Он оценивает аргументы по порядку и возвращает текущее значение первого выражения, которое изначально не оценивается как NULL.

ISNUMERIC возвращает 0 или 1 в зависимости от того, можно ли оцениваемое значение считать одним из числовых или числовых типов SQL. например int, bigint, money ..

NULLIF по существу находит указанное вами значение и, если оно совпадает, заменяет его значением NULL.

CAST Просто меняет тип данных на другой в этом примере на MONEY

Как вы можете видеть, если вы разберетесь ниже, используя эту информацию, я думаю, это довольно элегантное решение?

COALESCE(CAST(NULLIF(ISNUMERIC(COL1), 1) AS MONEY), COL1)
0 голосов
/ 19 июля 2012

Если вы хотите преобразовать его, вы должны использовать UPDATE вместо SELECT

UPDATE Table
SET Col1 = CAST(Col1 As Decimal(18,2))
0 голосов
/ 13 октября 2009
SELECT  CASE IsNumeric(mycol) WHEN 1 THEN CAST(mycol AS FLOAT) ELSE 0 END
FROM    mytable
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...