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 ) ;
答案 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