使用子字符串转换将数据类型varchar转换为numeric时出错

时间:2014-11-13 16:44:48

标签: sql sql-server

SQL Server Table有一列varchar(250),其数据如下: (933.13755119234614,-725.869154930114746)(334.30714385628804,103.50584506988525)等。

我想将第一对中的前两个数字与一些外部值进行比较。

我使用以下查询,有时候工作正常,但有时会导致错误将varchar转换为数字。我哪里错了?

select * 
from testentry2
where (convert(decimal(10,6),substring(data,2,10)) between 25 and 635 )
AND (convert(decimal(10,6),substring(data,CHARINDEX(',',data)+1,10)) between -99 and -9 ) ;

2 个答案:

答案 0 :(得分:1)

您不需要所需比较的完整数字。你可以试试这个:

where (convert(decimal(10,6),substring(data, 2, 5)) between 25 and 635 ) AND
      (convert(decimal(10,6),substring(data,CHARINDEX(',', data)+1, 4)) between -99 and -9

数字“5”和“4”可能有点过分。但这个想法很简单。如果第一个数字是12345678.9,那么前五个数字就足够了,因为12345超出了你的范围。

也许这会有助于格式化问题。否则,您将需要解析字符串,这在SQL Server中并不令人愉快(尽管您可以在Web上找到split()的各种实现)。作为一般规则,您不希望在字符串中存储分隔列表。这些数据实际上应该是另一个表中的单独列和行。

答案 1 :(得分:1)

如果你真的想要整个数字,在SQL中解析是非常不愉快的:

SELECT  CONVERT(decimal(10,6),SUBSTRING(data, 2, CHARINDEX(',', data)-2)) AS FirstNumber,
        CONVERT(decimal(10,6),SUBSTRING(data, CHARINDEX(',', data)+2, CHARINDEX(')(', data)-CHARINDEX(',', data)-2)) AS SecondNumber,
        CONVERT(decimal(10,6),SUBSTRING(data, CHARINDEX(')(', data)+2, CHARINDEX(',',data, CHARINDEX(')(', data))-CHARINDEX(')(', data)-2)) AS ThirdNumber,
        CONVERT(decimal(10,6),SUBSTRING(data, CHARINDEX(',', data, CHARINDEX(')(', data))+2, LEN(data)-CHARINDEX(',', data, CHARINDEX(')(', data))-2)) AS FourthNumber
FROM testentry2