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中某个字段属性为varchar,我想把这个字段改成int型