2017-01-11 45 views
1

我正在使用Oracle SQL,並且想知道下面的2個查詢如何返回完全相同的東西,而有時會返回不同的結果。SQL:與substr一起使用to_char

select substr(to_char(min_code + 10, '099'),1,3) 
from x 
where a = b; 


select substr(min_code + 10,1,2) 
from x 
where a = b; 

首屆查詢的SUBSTR長度設置爲3,而第二個查詢具有SUBSTR長度設置爲2。然而,當min_code等於151兩種查詢將返回16.這怎麼可能?

我知道它必須與substr如何計算使用to_char時的長度有關,但我的理解是第二個參數(在這些情況下爲1)是子串開始的位置,第三個參數是子串的長度。然而,第一個查詢仍然會返回16而不是我想象中的161。

然後,當我用min_code等於051的記錄測試它時,第1個查詢將返回06,而第2個查詢將返回61.我理解第2個查詢如何獲取61,因爲它在執行時必須丟棄前導0算術運算,但如何在第一個查詢(與to_char函數)返回06.我期望061長度爲3.

+1

嘗試'選擇'|' || to_char(151,'099')|| '|' from dual',然後將格式掩碼編輯爲'FM099'';這應該可以幫助你找到問題 – Aleksej

回答

1

只是把你的測試在一個單一的查詢,並刪除+10(問題是不存在),這是你有什麼:

SQL> with testCases(n) as (select 151 from dual union select 51 from dual) 
    2 select n, 
    3   substr(to_char(n, '099'),1,3) as substr_3, 
    4   substr(n,1,2) as substr_3 
    5 from testCases; 

     N SUBSTR_3  SUBSTR_3 
---------- ------------ -------- 
     51 05   51 
     151 15   15 

我相信是什麼讓你期望一個不同的結果是to_char應該做什麼;澄清一下,看看下面的結果:

SQL> with testCases(n) as (select 151 from dual union select 51 from dual) 
    2 select n, 
    3   '|' || to_char(n, '099') || '|' as to_char 
    4 from testCases; 

     N TO_CHA 
---------- ------ 
     51 | 051| 
     151 | 151| 

這裏可以看到,to_char添加一個空格所得到的字符串;這會使你的子字符串邏輯失效,給你意想不到的結果。 這種行爲清楚地解釋here

額外的前導空格是潛在的減號。要刪除 空間,您可以在格式

事實上使用FM,如果編輯格式掩碼,您有

SQL> with testCases(n) as (select 151 from dual union select 51 from dual) 
    2 select n, 
    3   '|' || to_char(n, 'FM099') || '|' as to_char 
    4 from testCases; 

     N TO_CHA 
---------- ------ 
     51 |051| 
     151 |151| 

和測試用例成爲:

SQL> with testCases(n) as (select 151 from dual union select 51 from dual) 
    2 select n, 
    3   substr(to_char(n, 'FM099'),1,3) as substr_3, 
    4   substr(n,1,2) as substr_2 
    5 from testCases ; 

     N SUBSTR_3  SUBSTR_2 
---------- ------------ -------- 
     51 051   51 
     151 151   15