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

Posted

技术标签:

【中文标题】SQL Server 将变量 varchar 字段转换为货币/小数/带小数位的东西【英文标题】:SQL Server converting a variable varchar field to money/decimal/something with decimal places 【发布时间】:2009-10-13 10:49:33 【问题描述】:

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

''
'abc'
'23'
'23.2'

该方法应该适用于所有人,并且对于第一个和第二个值应该返回 0,并且不会引发 SQL Server 错误..

【问题讨论】:

通常当你在一个字段中存储了不同类型的数据时,这表明你有一个数据库设计问题。 【参考方案1】:

试试这个:

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

你要调整目标数据类型,我选择了decimal(18, 2)来演示。

【讨论】:

IsNumeric 是一个讨厌的小函数,只要一个类型转换成任何一个数值类型它就返回1,但是你不知道是哪个类型已经同意它可以转换,所以对于输入'£1.20' 它会在演员表上抛出一个错误,即使它通过了数字。 很难将 1.2 英镑转换为货币,这就是 IsNumeric 允许它但拒绝转换为其他任何东西的原因。 '1e1' 是数字,因为它可以转换为实数或浮点数,但不能转换为 int,即使结果是整数。我从未见过令人信服的解决方案,它已经在***.com/questions/312054/… 中提供了解决方法的示例,各有利弊。 “无法将 char 值转换为货币”【参考方案2】:

我知道这是一个早已死去的话题,但我最近从 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,底部版本将其视为文本字段。

【讨论】:

【参考方案3】:
SELECT  CASE IsNumeric(mycol) WHEN 1 THEN CAST(mycol AS FLOAT) ELSE 0 END
FROM    mytable

【讨论】:

【参考方案4】:

如果你想转换它,你应该使用UPDATE而不是SELECT

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

【讨论】:

【参考方案5】:

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

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

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

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

如您所见,如果您使用此信息分解以下内容,我认为这是一个非常优雅的解决方案?

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

【讨论】:

以上是关于SQL Server 将变量 varchar 字段转换为货币/小数/带小数位的东西的主要内容,如果未能解决你的问题,请参考以下文章

SQL SERVER中某个字段属性为varchar,我想把这个字段改成int型,如何操作?

SQL Server中varchar(n)和nvarchar(n)

SQL Server中char与varchar数据类型区别

SQL SERVER中某个字段属性为varchar,我想把这个字段改成int型

在 SQL Server 2008 中将数据从浮点类型的 Excel 导入 varchar

sql server哪个字段类型可以保存最长文字