2015-10-23 59 views
1

我正面臨Oracle SQL的問題substr()函數。Oracle substr(),隱式轉換?

看起來好像substr()行爲超出其規定的目的,這樣,

substr(some.field, 0, 7) <> '1598200'

其中

some.field = '1598200, 123456'

即將在這裏發揮作用,

select sum(t.amount) 
from ivtransaction t 
inner join ivpaymentreminders p on p.transactionid = t.transactionid 
left join ivinvoice i on i.invoiceid = t.invoiceid 
where substr(p.collectiveinvoiceno, 0, 7) = '1598200' 

p.collectiveinvoiceno,4條預計將調高:

rownum | p.collectiveinvoiceno 
--------------------------------- 
1  | 1598200 
2  | 1598200 
3  | 1598200, 123456 
4  | 1598200, 456789 

但只有1和2行轉起來,並添加到sum(t.amount)

  • 當自己的測試,substr(p.collectiveinvoiceno, 0, 7)提取正確的價值觀
  • 轉換使用to_char爭論的左右兩側都沒有區別

這是某種形式的隱式轉換?如果是這樣,如何解決它?

感謝任何想法,

英格麗

編輯:事實證明,在SUBSTR(字段,1,7)相比沒有趕上4/4行,因爲目標字符串是在回到第3和第4行,不是領先的。我被愚弄了,因爲在應用程序中,目標字符串顯示爲前導!我是一個初學者,所以這是非常有用的,謝謝你的所有意見。英格麗

+0

也許問題出在另一個地方。 (內部加入ivpaymentreminders)。你也可以用('where'instr(some_value,'1598200')> 0;') –

+1

中的字符串替換爲substr,因此它應該是'substr(p.collectiveinvoiceno,1,7)'。但不確定它是否有助於你的情況,因爲問題也可能在聯結中。刪除你的'WHERE'並檢查你是否得到了所有必要的行。 – Tatiana

+1

從Oracle文檔:當位置爲0(零)時,它被視爲1 – Rene

回答

1

SUBSTR(p.collectiveinvoiceno,0,7)

這是一個不好的做法,使用0起始位置SUBSTR,你應該使用1。雖然,文檔指出:

如果位置是0,那麼它是作爲1

有與過濾器謂語SUBSTR沒有問題的處理,它會獲取所有的4行。

SQL> WITH DATA AS(
    2 SELECT '1598200' str FROM dual UNION ALL 
    3 SELECT '1598200' FROM dual UNION ALL 
    4 SELECT '1598200, 123456' FROM dual UNION ALL 
    5 SELECT '1598200, 456789' FROM dual 
    6 ) 
    7 SELECT str, substr(str, 1, 7) FROM DATA 
    8 WHERE substr(str, 1, 7) = '1598200'; 

STR    SUBSTR(
--------------- ------- 
1598200   1598200 
1598200   1598200 
1598200, 123456 1598200 
1598200, 456789 1598200 

沒有必要使用TO_CHAR因爲你已經對雙方的字符串數據類型。因此,隱式數據類型轉換沒有任何問題。看看解釋計劃

SQL> select * from table(dbms_xplan.display); 

PLAN_TABLE_OUTPUT 
------------------------------------------------------------------------- 
Plan hash value: 560839587 

------------------------------------------------------------------------- 
| Id | Operation  | Name | Rows | Bytes | Cost (%CPU)| Time  | 
------------------------------------------------------------------------- 
| 0 | SELECT STATEMENT |  |  4 | 36 |  8 (0)| 00:00:01 | 
| 1 | VIEW   |  |  4 | 36 |  8 (0)| 00:00:01 | 
| 2 | UNION-ALL  |  |  |  |   |   | 
| 3 | FAST DUAL  |  |  1 |  |  2 (0)| 00:00:01 | 
| 4 | FAST DUAL  |  |  1 |  |  2 (0)| 00:00:01 | 
| 5 | FAST DUAL  |  |  1 |  |  2 (0)| 00:00:01 | 

PLAN_TABLE_OUTPUT 
------------------------------------------------------------------------- 
| 6 | FAST DUAL  |  |  1 |  |  2 (0)| 00:00:01 | 
------------------------------------------------------------------------- 

13 rows selected. 

但只有1和2行轉起來,並加入到總和(t.amount)

這取決於JOIN條件。 filer謂詞工作正常。

+0

非常感謝Lalit,但我仍然無法使用substr()獲取所有4行,返回2/4行,而使用instr()返回4/4行,這兩個版本都是在內連接運行的情況下運行的。 – IngridSkard