2

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

''
'abc'
'23'
'23.2'

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

4

5 回答 5

4

尝试这个:

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

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

于 2009-10-13T10:56:25.240 回答
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,底部版本将其视为文本字段。

于 2014-01-08T22:06:14.300 回答
0
SELECT  CASE IsNumeric(mycol) WHEN 1 THEN CAST(mycol AS FLOAT) ELSE 0 END
FROM    mytable
于 2009-10-13T10:56:03.073 回答
0

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

UPDATE Table
SET Col1 = CAST(Col1 As Decimal(18,2))
于 2012-07-19T15:49:13.430 回答
0

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

ISNUMERIC返回 0 或 1,具体取决于正在评估的值是否可以被视为 SQL 'number' 或 'numeric' 类型之一。例如 int、bigint、money..

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

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

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

COALESCE(CAST(NULLIF(ISNUMERIC(COL1), 1) AS MONEY), COL1)
于 2017-07-30T12:50:40.533 回答