oracle cast用法 - SQL錯誤“ORA-01722:無效的數字”




convert conversion (11)

嘗試將字符串轉換為數字時,會發生ORA-01722錯誤,並且該字符串無法轉換為數字。

在沒有看到您的表定義的情況下,您似乎正在嘗試將值列表末尾的數字序列轉換為數字,並且分隔它的空格會拋出此錯誤。 但根據你給我們的信息,它可能發生在任何領域(第一個除外)。

對某人來說非常容易,以下插頁給了我

ORA-01722:無效的號碼

為什麼?

INSERT INTO CUSTOMER VALUES (1,'MALADY','Claire','27 Smith St Caulfield','0419 853 694');
INSERT INTO CUSTOMER VALUES (2,'GIBSON','Jake','27 Smith St Caulfield','0415 713 598');
INSERT INTO CUSTOMER VALUES (3,'LUU','Barry','5  Jones St Malvern','0413 591 341');
INSERT INTO CUSTOMER VALUES (4,'JONES','Michael','7  Smith St Caulfield','0419 853 694');
INSERT INTO CUSTOMER VALUES (5,'MALADY','Betty','27 Smith St Knox','0418 418 347');

如果您的號碼錯誤無效,請嘗試此操作

在這個a.emplid是數字,b.emplid是一個varchar2,所以如果你要轉換其中一個邊

其中to_char(a.emplid)= b.emplid


那麼它也可以是:

SELECT t.col1, t.col2, ('test' + t.col3) as test_col3 
FROM table t;

在oracle中連接的位置使用運算符|| 不是+

在這種情況下,您得到: ORA-01722: invalid number ...


您始終可以使用TO_NUMBER()函數來刪除此錯誤。這可以包含為INSERT INTO員工phone_number值(TO_NUMBER('0419 853 694');


這是解決問題的一種方法。 刪除非數字字符,然後將其強制轉換為數字。

cast(regexp_replace('0419 853 694', '[^0-9]+', '') as number)

假設電話號碼定義為NUMBER則空格不能轉換為數字:

create table telephone_number (tel_number number);
insert into telephone_number values ('0419 853 694');

以上給你一個

ORA-01722:無效的號碼


這是因為:

您執行了一個試圖將字符串轉換為數字的SQL語句,但它不成功。

如下所述:

要解決此錯誤:

只有包含數值的數字字段或字符字段才能用於算術運算。 確保所有表達式都評估為數字。


在我的情況下,轉換錯誤是在我為表創建的基於功能的索引中。

插入的數據沒問題。 我花了一段時間才弄清楚實際的錯誤是來自有缺陷的索引。

如果Oracle在這種情況下可以提供更準確的錯誤消息,那就太好了。


當您嘗試將非數字值插入db中的數字列時出現此錯誤,似乎您的最後一個字段可能是數字,並且您嘗試將其作為字符串發送到數據庫中。 檢查你的最後一個價值


我有這個問題:

select max(acc_num) from ACCOUNTS where acc_num between 1001000 and 1001999;

那個問題出現了: Error: ORA-01722: invalid number

我剛剛包圍了“數字”值,使它們成為'Strings' ,並使它們明確分隔

select max(acc_num) from ACCOUNTS where acc_num between '1001000' and '1001999';

...並且瞧:它返回了預期的結果。

編輯:確實:我表中的col acc_num被定義為String 。 雖然不是數字,但報告了invalid number 。 並且字符串數字的顯式分隔解決了問題。

另一方面,Oracle 可以將字符串視為數字。 因此,數字操作/函數可以應用於字符串,這些查詢工作:

從TABLE中選擇max (string_column);

從TABLE中選擇string_column,其中string_column '2'和'z'之間;

從TABLE中選擇string_column,其中string_column > '1';

從TABLE中選擇string_column,其中string_column <= 'b';


對於非數字字符串,請try: except:實際上比正則表達式慢。 對於有效數字的字符串,正則表達式更慢。 所以,適當的方法取決於你的輸入。

如果您發現自己處於性能綁定中,則可以使用名為fastnumbers的新第三方模塊,該模塊提供稱為isfloat的功能。 充分披露,我是作者。 我已在下面的時間表中列出了其結果。

from __future__ import print_function
import timeit

prep_base = '''\
x = 'invalid'
y = '5402'
z = '4.754e3'
'''

prep_try_method = '''\
def is_number_try(val):
    try:
        float(val)
        return True
    except ValueError:
        return False

'''

prep_re_method = '''\
import re
float_match = re.compile(r'[-+]?\d*\.?\d+(?:[eE][-+]?\d+)?$').match
def is_number_re(val):
    return bool(float_match(val))

'''

fn_method = '''\
from fastnumbers import isfloat

'''

print('Try with non-number strings', timeit.timeit('is_number_try(x)',
    prep_base + prep_try_method), 'seconds')
print('Try with integer strings', timeit.timeit('is_number_try(y)',
    prep_base + prep_try_method), 'seconds')
print('Try with float strings', timeit.timeit('is_number_try(z)',
    prep_base + prep_try_method), 'seconds')
print()
print('Regex with non-number strings', timeit.timeit('is_number_re(x)',
    prep_base + prep_re_method), 'seconds')
print('Regex with integer strings', timeit.timeit('is_number_re(y)',
    prep_base + prep_re_method), 'seconds')
print('Regex with float strings', timeit.timeit('is_number_re(z)',
    prep_base + prep_re_method), 'seconds')
print()
print('fastnumbers with non-number strings', timeit.timeit('isfloat(x)',
    prep_base + 'from fastnumbers import isfloat'), 'seconds')
print('fastnumbers with integer strings', timeit.timeit('isfloat(y)',
    prep_base + 'from fastnumbers import isfloat'), 'seconds')
print('fastnumbers with float strings', timeit.timeit('isfloat(z)',
    prep_base + 'from fastnumbers import isfloat'), 'seconds')
print()
Try with non-number strings 2.39108395576 seconds
Try with integer strings 0.375686168671 seconds
Try with float strings 0.369210958481 seconds

Regex with non-number strings 0.748660802841 seconds
Regex with integer strings 1.02021503448 seconds
Regex with float strings 1.08564686775 seconds

fastnumbers with non-number strings 0.174362897873 seconds
fastnumbers with integer strings 0.179651021957 seconds
fastnumbers with float strings 0.20222902298 seconds

如你看到的

  • try: except:數字輸入快,但對於無效輸入非常慢
  • 當輸入無效時,正則表達式非常有效
  • fastnumbers在兩種情況下fastnumbers獲勝




sql oracle plsql casting type-conversion