2009-08-24 69 views
1

我有這個疑問,在甲骨文工作,但我想它轉換爲用,因爲我與Visual Studio有一些問題合併。的Oracle SQL使用合併

SELECT * 
FROM a Left Join b on b.institution_code=a.institution_code 
WHERE 
     (upper(a.Login_Name)=UPPER('%' || :Login_Name || '%') OR :Login_Name IS NULL) 
    AND (upper(a.Display_Name) Like UPPER('%' || :Display_Name || '%') OR :Display_Name IS NULL) 
    AND (upper(a.Email_Address)=UPPER(:Email_Address) OR :Email_Address IS NULL) 
    AND ((a.institution_code=:institution_code) OR :institution_code IS NULL) 
    AND (upper(b.institution_desc) Like UPPER('%' || :institution_desc || '%') OR :institution_desc IS NULL) 

這工作

WHERE 
Upper(a.Display_Name) LIKE Upper('%' || COALESCE(:Display_Name,a.Display_Name) || '%') 
AND upper(a.Login_Name)=Upper(COALESCE(:Login_Name,a.Login_Name))  
AND upper(a.Email_Address)=Upper(COALESCE(:Email_Address,a.Email_Address)) 

但是當我嘗試到institution_code和institution_desc場使用COALESCE我沒有得到來自任何查詢結果轉換。

當我添加這些線路目前還沒有結果

AND a.institution_code=COALESCE(:institution_code,a.institution_code) 
    AND (Upper(b.institution_desc) LIKE Upper('%' || COALESCE(:institution_desc,b.institution_desc) || '%')) 

回答

0

我懷疑問題是二號線(b.institution_desc)。具體而言,您可能會遇到NULL LIKE NULL的情況,並且NULL LIKE NULL返回false。

試試這樣說:

AND Upper(b.institution_desc) LIKE '%' || Upper(COALESCE(:institution_desc,b.institution_desc,'')) || '%' 
+0

遺憾,但這並沒有工作 – 2009-08-24 20:40:14

1
WHERE (UPPER(a.Login_Name) = UPPER('%' || :Login_Name || '%') OR :Login_Name IS NULL) 

...應該是:

WHERE (:Login_Name IS NULL OR UPPER(a.Login_Name) = UPPER('%' || :Login_Name || '%')) 

你想先檢查綁定變量 - 否則,你知道這樣做之前數據對比無論如何,你想要的一切。查詢中出現最糟糕的表現。

接下來,如果你要在衆多列運行UPPER - 使用子查詢分解要把它進行第一:

WITH upper_a AS (
SELECT a.pk, 
     UPPER(a.login_name) 'login_name', 
     UPPER(a.display_name) 'display_name', 
     UPPER(a.email_address) 'email_address', 
     UPPER(b.institution_desc) 'institution_desc' 
    FROM a) 
SELECT * 
    FROM A a 
    JOIN upper_a ua ON ua.pk = a.pk 
WHERE :Login_Name IS NULL OR ua.login_name = v_login_name 

甲骨文不會做WHERE(parmeter爲空或t.col =參數),而且通過使用具有可選值的參數使用綁定變量,您什麼也得不到。你真正想要使用的是CONTEXT變量(自9i起可用)。

+0

我們對甲骨文8i的 – 2009-08-24 20:46:58

+0

Drats - 你不能使用子查詢分解或上下文變量,直到9i中。但我仍然建議不要在可選參數的情況下使用COALESCE,以便仍然不必要地執行索引掃描甚至全表掃描。 – 2009-08-24 20:56:05

2
AND ((a.institution_code=:institution_code) OR :institution_code IS NULL) 

不等同於

AND a.institution_code=COALESCE(:institution_code,a.institution_code) 

IF a.institution_code IS NULL和:institution_code IS NULL,則第一個例子將爲真(因爲OR的第二部分是真實的),但第二個不會(因爲NULL = NULL是不正確的)。