1

我有这个在 Oracle 中工作的查询,但我想将它转换为使用 Coalesce,因为我在使用 Visual Studio 时遇到了一些问题。

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))

但是当我尝试将机构代码和机构描述字段转换为使用合并时,我没有从查询中得到任何结果。

当我添加这些行时没有结果

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

3 回答 3

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

不等于

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

如果 a.institution_code 为 NULL 且 :institution_code 为 NULL,则第一个示例为真(因为 OR 的第二部分为真),但第二个不为真(因为 NULL=NULL 不为真)。

于 2009-08-24T22:30:18.090 回答
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

Oracle 在 WHERE (parameter IS NULL OR t.col = parameter) 方面做得不好,并且通过将绑定变量用于具有可选值的参数,您什么也得不到。您真正想要使用的是 CONTEXT 变量(自 9i 起可用)。

于 2009-08-24T20:22:28.380 回答
0

我怀疑问题出在第二行(b.institution_desc)。具体来说,您有可能出现某种 NULL LIKE NULL情况,并NULL LIKE NULL返回 false。

试试这样:

AND Upper(b.institution_desc) LIKE '%' || Upper(COALESCE(:institution_desc,b.institution_desc,'')) || '%'
于 2009-08-24T20:19:54.670 回答