SQL Server将变量varchar字段转换为money / decimal /带小数位的东西

时间:2009-10-13 10:49:34

标签: sql-server sql-server-2005 data-conversion

我正在寻找一种优雅的方法来将varchar类型的字段(包含其中的可变数据)转换为可用于数学运算的数据类型来自该字段的样本数据 (不包括引号)

''
'abc'
'23'
'23.2'

该方法适用于所有人,对于第一个&第二个值应该返回0,而不是抛出SQL Server错误..

5 个答案:

答案 0 :(得分:3)

试试这个:

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

您必须调整目标数据类型,我已选择十进制(18,2)进行演示。

答案 1 :(得分:1)

我知道这是一个长期存在的线索,但我最近在谷歌搜索中偶然发现了它并且想了想。它不如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,底部版本将其视为文本字段。

答案 2 :(得分:0)

SELECT  CASE IsNumeric(mycol) WHEN 1 THEN CAST(mycol AS FLOAT) ELSE 0 END
FROM    mytable

答案 3 :(得分:0)

如果您想转换它,则应使用UPDATE代替SELECT

UPDATE Table
SET Col1 = CAST(Col1 As Decimal(18,2))

答案 4 :(得分:0)

COALESCE是一个很好的选择:查找更多信息here.它按顺序计算参数,并返回最初未评估为NULL的第一个表达式的当前值。

ISNUMERIC返回0或1,具体取决于所评估的值是否可被视为SQL'之一。或者'数字'类型。例如int,bigint,money ..

NULLIF基本上会找到您指定的值,如果匹配,则将其替换为NULL值。

CAST只需将此示例中的数据类型更改为另一个MONEY

即可

正如你所看到的,如果你使用这些信息打破下面这个,我认为这是一个非常优雅的解决方案吗?

COALESCE(CAST(NULLIF(ISNUMERIC(COL1), 1) AS MONEY), COL1)