2017-07-27 74 views
0

我呼籲MY_TABLE表:從數字轉換爲字符串工作不正常

| id (number) | some_data (varchar2(3)) | 

我然後查詢使用該表:P_DATA = 'BOB':

SELECT * FROM my_table 
where upper(some_data) = upper(CAST(:P_DATA AS VARCHAR(3)) ; 
// SELECT * FROM my_table where upper(some_data) = upper(CAST('BOB' AS VARCHAR(3)) 

這個偉大的工程,但是當綁定變量是一個數字010例如,它不返回任何內容:

SELECT * FROM my_table 
where upper(some_data) = upper(CAST(:P_DATA AS VARCHAR(3)) ; 
// SELECT * FROM my_table where upper(some_data) = upper(CAST(010 AS VARCHAR(3)) 

如果我把單引號圍繞010然後它返回數據:

SELECT * FROM my_table 
where upper(some_data) = upper(CAST(:P_DATA AS VARCHAR(3)) ; 
// SELECT * FROM my_table where upper(some_data) = upper(CAST('010' AS VARCHAR(3)) 

即使綁定變量是一個數字,我如何才能對所有這些場景進行此項工作?

+0

只要始終以字符串形式傳遞您的綁定變量。那麼不需要施放它。 – Boneist

+0

010是數字10,所以在投入字符串時它是'10',而不是'010'。 – trincot

+0

@trincot是否有辦法確保領先的0在那裏? – user2924127

回答

2

事情是,數字沒有顯着的前導零:010 = 0010。而'010'是一個字符串,它的前導零點有效值:'010' != '0010'

因此,當您將一個數值傳遞給:p_data時,它沒有重要的前導零,從字面上看它們被數字剝離。所以當你將它投射到一個字符串時,你會得到'10',這明顯不同於'010'。這很容易證明:

SQL> select * from dual 
    2 where '010' = cast(010 as varchar2(3)) 
    3/

no rows selected 

SQL> select * from dual 
    2 where '10' = cast(010 as varchar2(3)) 
    3/

D 
- 
X 

SQL> 

至於如何解決這個問題? Oracle數據庫是強大的數據類型。在一列中存儲不同的數據類型被廣泛認爲是不好的做法,因爲它總會給閱讀過程帶來問題。但是我們會放棄改變這種方法的可能性。所以你可以做的其他事情:

  1. 添加一個數據類型列,告訴讀者如何轉換存儲值。
  2. 確保打算成爲數字的值存儲爲數字,即不存在前導零。這可能很麻煩(應用程序的其他部分可能會顯式處理前導零,因此會中斷),並且它會持續保持警惕。

有沒有簡單的答案。