将逗号作为小数点分隔符的字符串数值转换为NUMERIC(10,2)


12

我有一个varchar列的SQL表,其中包含希腊格式的数字(。作为千位分隔符,而逗号作为十进制分隔符)

经典转换

CONVERT(numeric(10,2),REPLACE([value],',','.'))

不起作用,因为。(千位分隔符)杀死转换

例如尝试

CONVERT(numeric(10,2),REPLACE('7.000,45',',','.'))

我想将这些值转换为数字(10,2)

关于如何处理的任何建议?

Answers:


10

如果您使用的是SQL Server 2012或更高版本,请参阅@wBob的答案以获取更清洁的方法。仅当您使用SQL Server 2008 R2或更旧版本时,才需要以下答案中概述的方法。

转换NUMERIC为时,您不需要(或想要)千位分隔符,无论它是逗号,句点还是空格,因此只需先除去它们。然后将逗号转换为句点/小数,就可以了:

SELECT CONVERT(NUMERIC(10, 2), 
               REPLACE(
                       REPLACE('7.000,45', '.', ''),
                       ',', '.'
                      )
              ) AS [Converted];

返回值:

7000.45

为了完整起见,我应该提到我也尝试过:

  • SET LANGUAGE Greek;

  • 查看CONVERT的各种格式样式,但此处没有内容适用。

  • 格式的功能,但输入型必须是数字或日期/时间/日期时间值(即,它在SQL Server 2012中引入,所以并不适用于SQL Server 2008 R2或以上)。

似乎没有其他工作。我希望找到比两个REPLACE电话更优雅的东西,但到目前为止还没有这种运气。


另外,仅提一下,尽管它不是纯T-SQL解决方案,但也可以通过SQLCLR完成。并且,在名为String_TryParseToDecimalSQL#库(我编写的)中有一个预先完成的函数。此功能在免费版本中可用,并且在从SQL Server 2005开始的每个SQL Server版本中均可使用:

SELECT SQL#.String_TryParseToDecimal('7.000,45', 'el-GR');

返回值:

7000.45000000000000000000

10

您正在使用哪个版本的SQL Server?从SQL Server 2012起,您可以将TRY_PARSE与它的USING culture参数一起使用。您也可以使用PARSEPARSE如果转换失败,则差异将失败并TRY_PARSE返回a NULL,例如

DECLARE @t TABLE ( x VARCHAR(10) )

INSERT INTO @t
VALUES ( '7.000,45' ), ( 'xxx' )

SELECT x, 
    TRY_PARSE( x AS NUMERIC(10,2) USING 'El-GR' ) x
FROM @t

试验结果

高温超导


1
我只是在答案的顶部添加了一条注释,将读者定向到此处(如果他们使用的是SQL Server 2012或更高版本)。
所罗门·鲁兹基

0

以下代码适用于我的情况:

select convert(varchar,FORMAT(123456789.0258,'###,###,###.00','de-de'))

输出:123.456.789,03


或选择convert(varchar,FORMAT(cast(yourValue as numeric(10,2)),'###,###,###。00','de-de'))
Shahed Adnan

2
看来您正在回答OP要求的相反问题。他们不想格式化数字值,他们想将格式化的varchar值转换为数字。
ypercubeᵀᴹ

1
此外,两个附注:1)总是指定的长度VARCHARNVARCHARCHAR,和NCHAR类型。在某些情况下,默认值为30;在其他情况下,默认值为1,这将导致代码无法维护/易于出错。2)使用时,您不需要确切的布局#。您只需要其中一个(例如#)来表示所有数字,但不需要千位分隔符,或者将其中两个用逗号分隔(例如#,#)即可得到所有数字千位分隔符。因此,SELECT CONVERT(VARCHAR(20), FORMAT(123456789.0258, N'#,#.00', N'de'));返回与您建议的输出相同的输出。
所罗门·鲁茨基'18
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.