2017-08-25 110 views
-3

我有0.8和0.80的數據。在我的選擇查詢中,我收到了錯誤的數據 示例
從雙重選擇0.80; 從雙重選擇0.8;Oracle - 爲什麼數字的前導零消失

都給出了0.8,但是我的期望是當值爲0.80時顯示o.80。 我發現所有的情況下0.90,0.70 ..... 如何實現這一

+0

這是您的客戶的行爲。你使用哪個客戶端應用程序? –

+0

順便說一句,這是一個「尾隨」零。 「前導」零位在字符串的左側。 –

+0

'0.8'和'0.80'之間沒有數學上的區別。如果客戶端配置爲顯示尾隨零,則Oracle將以相同的方式將它們存儲起來,並且任何客戶端將以相同的方式顯示它們,具有相同數量的尾隨零。如果你想維護他們不同的小說,你需要存儲和顯示列作爲一個字符串。但那會是瘋狂的。 – APC

回答

0
select Ltrim(To_char(0.80, 'B999999999999999999990.99'), ' ') as bn from dual 
+0

在兩種情況下它都顯示0.80,但是在選擇Ltrim(To_char(0.8,'B999999999999999999990.99'),'')作爲bn的情況下,它只顯示0.8 rt。 –

0

0.80.800.80000都是相同的號碼,但它們的格式不同。

號的甲骨文內部表示不會存儲你是如何格式化他們在輸入時如此0.80.800.8000都將在數據庫中存儲爲數字0.8舉行。

您正在返回一個數字而不是格式化的字符串,因此Oracle將返回0.8並讓用戶界面(例如SQL/Plus)顯示它認爲合適的值。

如果你想與特定的格式(即始終保留兩位小數)的數量,那麼你將需要數轉換成一些其格式的字符串表示:

SELECT TO_CHAR(your_number, 'FM99999999990D00') FROM DUAL; 

如果你想要的數字原始形式進入(具有前導和/或尾隨零),那麼你將需要存儲這些數字作爲字符串來維護格式:如果數據類型NUMBER(它是在select 0.8 from dual對於爲例的

SELECT '0.8' FROM DUAL; 
SELECT '0.80' FROM DUAL; 
SELECT '00.8' FROM DUAL; 
1

E),然後0.8和0.80是無法區分的 - 它們都存儲在內部的相同的方式dump功能顯示:

with data (n) as 
(select 0.8 from dual 
    union all 
    select 0.80 from dual 
    union all 
    select 0.800000 from dual 
) 
select n, dump(n) from data; 

0.8 Typ=2 Len=2: 192,81 
0.8 Typ=2 Len=2: 192,81 
0.8 Typ=2 Len=2: 192,81 

因此,有沒有辦法讓甲骨文以不同的方式顯示它們。如果您想要VARCHAR2字符串而不是NUMBER,請使用select '0.8' from dual