【问题标题】:Searching a varchar field for numeric values of a certain range在 varchar 字段中搜索特定范围的数值
【发布时间】:2014-06-17 21:10:25
【问题描述】:

使用 Oracle SQL Developer v3.2.20.09:

我有一个数据表,在所有其他数据中,我有一列包含所有数字结果(例如,RESULT_NUM),但由于它的存储和使用方式,它是一个 varchar2 字段.我需要提取体温代码的所有记录(VT_CODE 字段中的BTTEMPTEMPERATURE)其中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() 可能会起作用,但只能通过更改评估顺序才能工作,并且将来可能会再次中断。

标签: sql oracle


【解决方案1】:

试试下面的

and convert(int,result_num) > 100

and CAST(result_num as INTEGER) > 100

【讨论】:

  • 转换选项给了我一个 ORA-00904 错误,说 INT 是一个无效的标识符。 CAST 声明似乎奏效了。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多