我正在寻找一种优雅的方式将 varchar 类型的字段(其中包含可变数据)转换为可用于数学运算的数据类型,该字段中的示例数据(不包括引号)
''
'abc'
'23'
'23.2'
该方法应该适用于所有人,并且对于第一个和第二个值应该返回 0,并且不会引发 SQL Server 错误。
我正在寻找一种优雅的方式将 varchar 类型的字段(其中包含可变数据)转换为可用于数学运算的数据类型,该字段中的示例数据(不包括引号)
''
'abc'
'23'
'23.2'
该方法应该适用于所有人,并且对于第一个和第二个值应该返回 0,并且不会引发 SQL Server 错误。
尝试这个:
SELECT CASE WHEN IsNumeric(YourColumn) = 0 THEN
0
ELSE
CAST(YourColumn AS decimal(18, 2))
END
您必须调整目标数据类型,我选择了 decimal(18, 2) 进行演示。
我知道这是一个早已死去的线程,但我最近从谷歌搜索中偶然发现了它并有了一个想法。它不如 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,底部版本将其视为文本字段。
SELECT CASE IsNumeric(mycol) WHEN 1 THEN CAST(mycol AS FLOAT) ELSE 0 END
FROM mytable
如果你想转换它,你应该使用UPDATE
而不是SELECT
UPDATE Table
SET Col1 = CAST(Col1 As Decimal(18,2))
COALESCE
是一个很好的选择:在此处查找更多信息。它按顺序计算参数并返回最初不计算为 NULL 的第一个表达式的当前值。
ISNUMERIC
返回 0 或 1,具体取决于正在评估的值是否可以被视为 SQL 'number' 或 'numeric' 类型之一。例如 int、bigint、money..
NULLIF
本质上是找到您指定的值,如果匹配,则将其替换为一个NULL
值。
CAST
在此示例中只需将数据类型更改为另一种数据类型即可MONEY
如您所见,如果您使用此信息分解以下内容,我认为这是一个非常优雅的解决方案?
COALESCE(CAST(NULLIF(ISNUMERIC(COL1), 1) AS MONEY), COL1)