2009-10-13 91 views
2

我在寻找一种优雅的方式为VARCHAR类型的字段转换,并在它的可变数据,为数据类型可以用于从现场 数学运算采样数据(不包括引号)SQL Server中的变量varchar字段转换为金钱/十进制/东西带小数位

'' 
'abc' 
'23' 
'23.2' 

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

+0

通常,当你存储在一个场不同类型的数据,它表明你有一个数据库设计问题。 – HLGEM 2012-07-19 18:53:22

回答

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

试试这个:

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

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

+0

+1你用秒打我:-) – 2009-10-13 10:58:23

+2

IsNumeric是一个令人讨厌的小函数,只要一个类型转换为它返回1的任何数值类型,但是你不知道哪个类型已经同意它可以转换,所以对于输入“£1.20”,它会扔在施放的错误,即使它通过了ISNUMERIC。 – Andrew 2009-10-13 10:59:31

+0

感谢这个信息 – pablo 2009-10-13 11:10:50

0

如果您想将其转换,你应该使用的UPDATE代替SELECT

UPDATE Table 
SET Col1 = CAST(Col1 As Decimal(18,2)) 
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”刚刚2,底部的人会看到它作为一个文本字段。

0

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

ISNUMERIC返回0或1取决于如果被评估的值可以被认为是SQL“数字”或“数字”类型中的一种。例如int,bigint,money ..

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

CAST只要改变这个例子来MONEY

数据类型到另正如你可以看到,如果你打破了楼下使用该信息的一个非常优雅的解决方案,我认为?

COALESCE(CAST(NULLIF(ISNUMERIC(COL1), 1) AS MONEY), COL1) 
相关问题