【发布时间】:2014-06-17 21:10:25
【问题描述】:
使用 Oracle SQL Developer v3.2.20.09:
我有一个数据表,在所有其他数据中,我有一列包含所有数字结果(例如,RESULT_NUM),但由于它的存储和使用方式,它是一个 varchar2 字段.我需要提取体温代码的所有记录(VT_CODE 字段中的BT、TEMP、TEMPERATURE)其中result_num > 100(一切都在华氏度,因此仅搜索结果即可) .
所以,我的简单陈述是:
Select * from VITALS where VT_CODE in ('BT', 'TEMP', 'TEMPERATURE');
这让我恢复了所有超过 2M 的体温记录。现在我需要对其进行改进以获得超过 100 的结果。
当我尝试添加“和result_num > 100”时出现错误,因为它是一个 varchar 字段,我尝试使用数字进行搜索。
当我尝试添加“and result_num > '100'”时,它执行没有错误,因为它是一个字符值,但它返回大于 1 的所有值,而不是 100,这显然是所有值。
请帮忙。
【问题讨论】:
-
第一个查询出现什么错误? ORA-01722?这意味着您的数据实际上不是该列中的数字 - 这就是为什么您当然不应该将其存储为字符串的原因。
-
ORA-12801:并行查询服务器 P017 ORA-01722:无效编号 12801。00000 -“并行查询服务器 %s 中发出错误信号” *原因:并行查询服务器达到异常条件. *措施:检查以下错误消息的原因,并查阅您的错误手册以采取适当的措施。 *注释:可以使用事件 10397 关闭此错误,在这种情况下,将显示服务器的实际错误。
-
那么
result_num列中有非数字值;不一定在与您的vt_code过滤器匹配的行中,这取决于 Oracle 评估事物的顺序。您可能首先需要弄清楚它们为什么存在以及它们代表什么,以及是否需要修复它们。您也许可以跳过或适应它们,但这取决于它们是什么。 -
可能是因为它们有小数点?感谢您的帮助。
-
不,不是因为它们有小数点,除非你的 NLS 设置有误。显式的
to_number()或cast()可能会起作用,但只能通过更改评估顺序才能工作,并且将来可能会再次中断。