2014-06-11 70 views
0

我需要在Oracle数据库上写一个查询,其中一个字段的名称为ACCOUNTACCOUNT在保留列表http://docs.oracle.com/cd/B19306_01/em.102/b40103/app_oracle_reserved_words.htm上,我的查询失败。在where子句中使用Oracle保留字或关键字

在此DB中,ACCOUNTVARCHAR2,我不能更改它的名称和结构,我只能运行SELECT查询。

虽然ACCOUNT是一个VARCHAR2,它总是包含一个整数,我想获得一个值的范围。

我认为这会做的伎俩:

SELECT * 
FROM TABLE 
WHERE TO_NUMBER(ACCOUNT) > 1000 
AND TO_NUMBER(ACCOUNT) < 2000 

,但我只是得到一个ORA-01722无效号码错误。

我已经检查了ACCOUNT只包含整数和运行这个查询与非保留关键字正常工作......

+0

可能的重复[如何转义Oracle中的保留字?](http://stackoverflow.com/questions/1162381/how-do-i-escape-a-reserved-word-in-oracle) – Allan

+1

我不明白这个问题,或者至少是接受的答案...帐户是一个保留字,但是这并不能阻止它被用作非引用标识符。 [SQL Fiddle](http://sqlfiddle.com/#!4/f41dc/1),而且还在10gR2实例上进行了双重检查,因为这是doc链接的用途。这与ORA-01722无关? –

+1

另外有趣的是,'account'甚至不在[保留字列表]中(http://docs.oracle.com/cd/E18283_01/server.112/e17118/ap_keywd001。htm)in 11gR2;但它仍然在'v $ reserved_words';尽管11gR2和10gR2中所有的标志都设置为N,所以它并没有真正保留。所以,这是一个沼气标准的ORA-01722,为什么你不应该存储数字作为字符串问题。即使您已经检查过,“帐户”列中必须有一个非数字值。 –

回答

2

可以逃脱使用"双引号的保留字状

SELECT * 
FROM TABLE 
WHERE TO_NUMBER("ACCOUNT") > 1000 
AND TO_NUMBER("ACCOUNT") < 2000 

( OR)更好地利用BETWEEN构建像

SELECT * 
FROM TABLE 
WHERE TO_NUMBER("ACCOUNT") BETWEEN 1001 AND 1999 

如果你的表名确实是TABLE;你需要逃避,这也是一个保留字。

+0

+1。请记住请注意区分大小写。 – gustavodidomenico

+0

非常好,谢谢你,这是威胁。不,它不叫'TABLE'幸运! – user114671

+0

事实上,我必须等到该选项可用! – user114671

0

你试图别名添加到表

SELECT * 
FROM TABLE as tbl 
WHERE TO_NUMBER(tbl.ACCOUNT) > 1000 
AND TO_NUMBER(tbl.ACCOUNT) < 2000 
+0

谢谢,但这没有奏效。 – user114671

+1

它不会起作用......你必须逃避表名,就像@Rahul说的那样。 – gustavodidomenico

+0

一点也不......DDL命令起作用了,DML不会...... – gustavodidomenico

1

我看着你的问题,我是能够复制

这个错误ORA-01722无效号码错误。是因为你的SQL是试图东西转换像

TO_NUMBER( 'SOMETEXT')>一定数量

所以当你的SQL是转换TO_NUMBER( 'somenumber作为一个VARCHAR2'),它遇到('sometext VARCHAR2 )

示例

SELECT * FROM 如表TBL WHERE TO_NUMBER( '的HelloWorld')> 1000

这将引发的错误。检查你的列的数据,在那个数据的某个地方,有一行或多行有一些文本。