我有这个查询在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))
但是当我尝试将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 :(得分: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,则第一个示例为true(因为OR的第二部分为true),但第二个不是(因为NULL = NULL不为真)。 / p>
答案 1 :(得分: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 || '%'))
您想要检查绑定变量FIRST - 否则您在进行数据比较之前知道您还想要所有内容。你从查询中获得了最糟糕的表现。
接下来,如果你要在众多列上运行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(parmeter IS NULL或t.col =参数),并且通过对具有可选值的参数使用绑定变量,您什么也得不到。你真正想要使用的是CONTEXT变量(从9i开始可用)。
答案 2 :(得分:0)
我怀疑问题是第二行(b.institution_desc
)。具体来说,您可能会出现NULL LIKE NULL
情况,NULL LIKE NULL
会返回false。
试试这样:
AND Upper(b.institution_desc) LIKE '%' || Upper(COALESCE(:institution_desc,b.institution_desc,'')) || '%'