2009-08-24 52 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是不正确的)。