select mudel
from mudel
where 50 > TO_NUMBER(voimsus)
錯誤:ORA-01722:無效號碼
Voimsus是一個浮點數 ex。50.21 但資料型別是VARCHAR2. 任何想法如何轉換它。我也無法更改資料型別,因為有資料并且有子記錄。
資料
資料型別
解決方案:我將每個逗號更改為十進制
UPDATE mudel
SET voimsus = REPLACE(voimsus, ',', '.')
WHERE voimsus LIKE '%,%'
它奏效了
uj5u.com熱心網友回復:
假設您的會話nls_numeric_characters設定指定句點是您的小數分隔符,逗號是您的分組分隔符(即它有一個value“。”)
select *
from nls_session_parameters
where parameter = 'NLS_NUMERIC_CHARACTERS'
雖然表中的資料使用逗號作為小數點分隔符,但這將是問題所在。您可以指定要在to_number呼叫中使用的 NLS 引數
create table my_table( incorrect_data_type varchar2(10) );
insert into my_table( incorrect_data_type ) values( '123,45');
select to_number( incorrect_data_type,
'9999D99',
q'{nls_numeric_characters=',.'}')
from my_table;
或者您可以更改會話的設定
alter session set nls_numeric_characters = ',.'
select to_number( incorrect_data_type) from my_table;
當然,如果您通過更改會話設定來解決問題,這意味著當您(或其他人)開始新會話時,他們也需要更改會話設定(假設他們使用相同的 NLS 設定來建立你的連接)。
當然,正確的答案是首先為列使用正確的資料型別。將數字資料存盤在字符列中會引起很多麻煩——這只是容易出錯的方法之一。現在修復資料型別將為您節省很多痛苦。
這是一個顯示選項作業(和失敗)的小提琴。
uj5u.com熱心網友回復:
將字串轉換為數字時,不要僅通過使用來依賴會話設定
to_number(voimsus)
但指定存盤在字串中的格式。為此,您必須用 . 告訴 DBMS 小數點分隔符是什么NLS_NUMERIC_CHARACTERS。例如:
TO_NUMBER(voimsus, '9999999999D.99', 'NLS_NUMERIC_CHARACTERS='',.''')
但是,當然最好不要一開始就將數字存盤在字串列中。使用適當的數字型別,例如NUMBER(12,2)。(并且我建議不要使用任何浮點資料型別,例如 ( BINARY_FLOAT),因為這樣您存盤的數字不是精確的,而是近似的,例如 1.3 可能存盤為 1.3000001 之類的東西)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/418750.html
標籤:
