首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Oracle SQL使用Coalesce

Oracle SQL使用Coalesce
EN

Stack Overflow用户
提问于 2009-08-25 04:10:30
回答 3查看 1.7K关注 0票数 1

我有一个可以在Oracle中工作的查询,但由于Visual Studio遇到一些问题,我想将它转换为使用Coalesce。

代码语言:javascript
运行
复制
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)

这是可行的

代码语言:javascript
运行
复制
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时,从查询中得不到任何结果。

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

代码语言:javascript
运行
复制
    AND a.institution_code=COALESCE(:institution_code,a.institution_code)
  AND (Upper(b.institution_desc) LIKE Upper('%' || COALESCE(:institution_desc,b.institution_desc) || '%'))
EN

回答 3

Stack Overflow用户

发布于 2009-08-24 22:30:18

代码语言:javascript
运行
复制
AND ((a.institution_code=:institution_code) OR :institution_code IS NULL)

不等同于

代码语言:javascript
运行
复制
AND a.institution_code=COALESCE(:institution_code,a.institution_code)

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

票数 2
EN

Stack Overflow用户

发布于 2009-08-24 20:22:28

代码语言:javascript
运行
复制
WHERE (UPPER(a.Login_Name) = UPPER('%' || :Login_Name || '%') OR :Login_Name IS NULL)

...should be:

代码语言:javascript
运行
复制
WHERE (:Login_Name IS NULL OR UPPER(a.Login_Name) = UPPER('%' || :Login_Name || '%'))

你想先检查绑定变量--否则你在做数据比较之前就知道你想要所有的东西。您将从查询中获得可能最差的性能。

接下来,如果您要对多个列运行UPPER -使用子查询分解首先执行它:

代码语言:javascript
运行
复制
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 (参数为NULL或t.col = parameter),并且通过使用绑定变量为具有可选值的参数什么也得不到。您真正想要使用的是上下文变量(从9i开始提供)。

票数 1
EN

Stack Overflow用户

发布于 2009-08-24 20:19:55

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

像这样试一下:

代码语言:javascript
运行
复制
AND Upper(b.institution_desc) LIKE '%' || Upper(COALESCE(:institution_desc,b.institution_desc,'')) || '%'
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1324475

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档