如何在oracle中将数值与包含十进制(正数和负数)值的varchar2进行比较

时间:2016-05-17 22:18:30

标签: java oracle type-conversion

我正在进行查询,其中一个表有两列(lat& lng),两个都是varchar2类型,两者的值都是6.22863633或-75.60202274。 查询的一个条件是

AND PV.LAT >= '" + lowLat.toString() + "'
AND PV.LAT <= '" + upperLat.toString() + "'";

但是当lowLat变量的值大于10时,尽管存在这样的结果,但没有返回结果。如果我强制变量的值小于10,则结果就在那里。

所以我无法更改列的类型,因为客户端禁止更改 我查询了空格,并且最后有很多带空格的值,我尝试使用TRIM并使用TO_NUMBER进行投射,但似乎没有任何效果。

我对这个子喷气机有任何想法

2 个答案:

答案 0 :(得分:0)

编辑(稍后,但这属于顶部) - DUH!如果你比较8为&#34;在3和15&#34;之间会发生什么?但AS STRINGS?如果您将它们命名为字符串,则在3之后和15之后!你真的需要把所有东西都作为数字而不是字符串。 (此外,如果您这样写,something between '3' and '15',您将不会获得任何行 - 因为字符串&#39; 3&#39;大于&#39; 15&#39;并且Oracle是使用BETWEEN时不灵活;较低(较小)的数字,日期或字符串必须始终排在第一位。)

原始答案:

确切地了解数据库中存储的内容的一种方法是使用DUMP。例如:

SQL> select dump('   -20.99300') from dual;

DUMP('-20.99300')
--------------------------------------------------
Typ=96 Len=12: 32,32,32,45,50,48,46,57,57,51,48,48

通过查看dump的输出,可以看到值为VARCHAR2(Type = 96),它的长度为12个字符,前三个是空格(ASCII代码32)等。 / p>

你能做到这一点......你的一个大于10的纬度并在其上调用DUMP吗?例如:

select dump(max(lat)) from pv

并为自己解释或在此发布,以便我们帮助您阅读。

在您(或我们)首先找出问题的真正原因之前,尝试猜测解决方案毫无意义。

答案 1 :(得分:0)

嗨,谢谢你的所有想法,我尝试了一切,并设法得到一些结果,但不是最好的结果,所以我说服客户让我创建另一个表来将坐标与原始表上的id相关联数字格式,明天我会这样做,并更改所有相关代码以使用新表。 但是仍然非常感谢你,对我来说,正确的答案是更改列的类型但是......