我正在寻找一种优雅的方法来将varchar类型的字段(包含其中的可变数据)转换为可用于数学运算的数据类型来自该字段的样本数据 (不包括引号)
''
'abc'
'23'
'23.2'
该方法适用于所有人,对于第一个&第二个值应该返回0,而不是抛出SQL Server错误..
答案 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)