2014-06-11 75 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

這將引發的錯誤。檢查你的列的數據,在那個數據的某個地方,有一行或多行有一些文本。