一个结果集Oracle中的不同表字段

时间:2013-08-08 12:55:40

标签: sql oracle

我从拥有零售和企业客户的桌子中进行选择。我希望我的结果集在一列中返回公司和零售客户的名称。目前我将它们返回两个不同的列,如下所示:

select e.cust_id, 
       e.cust_location, 
       f.location
       max(case 
             when e.preferredname is not null 
             then e.preferredname 
           end
          )RETAIL_CUST_NAME,
       max(case 
             when e.preferredname is null 
             then e.CORP_NANME 
           end 
          )CORPORATE_CUST_NAME 
  from Mytable e, 
       myothertable f 
 where e.cust-id = f.cust_id
 group by e.cust_id, 
       e.cust_location, 
       f.location, 
       e.preferredname, 
       e.corp_name;

我正在尝试做什么可能以及如何在不必为零售和其他公司客户返回不同列的情况下实现此目标?

3 个答案:

答案 0 :(得分:5)

如果只填充了两个字段中的一个,则返回填充为单个列的任何一个都非常简单:

select e.cust_id, 
      e.cust_location, 
      f.location
      coalesce(e.preferredname, e.CORP_NANME) as CUST_NAME,
from Mytable e
     join myothertable f on e.cust_id = f.cust_id

coalesce返回它遇到的第一个非空值。

我不确定你的查询中聚合的重点是什么,所以我把它留了出来。


作为一个脚注,在Oracle中,nvlcoalesce的表现非常相似,具有以下重要区别:

  1. nvl只需要2个参数,而合并可以采用 n 参数
  2. 当函数或方程作为参数传递给它们时,nvl将评估其所有参数,但coalesce将按顺序评估每个参数,当它达到非空值时停止(在其他单词,coalesce将使用短路评估,但nvl不会。)
  3. 这一点非常重要,因为您经常会看到nvl用于类似目的。

答案 1 :(得分:4)

如下所示编写查询,您可以在一列中获取cust_name

select e.cust_id, 
   e.cust_location, 
   f.location
   max(case 
         when e.preferredname is not null 
         then e.preferredname 
       Whene preferredname is null 
         then e.CORP_NANME 
       end 
      )CUST_NAME 

答案 2 :(得分:3)

是的,您可以使用UNION(过滤掉重复项)或UNION ALL(不过滤)。

e.g。

select 
case when e.preferredname is not null then e.preferredname end 
as RETAIL_CUST_NAME,
from Mytable e
union all
select case when e.preferredname is null then e.CORP_NANME end 
from Mytable e

COALESCE,正如艾伦所说。如果您想使用其中一个(然后使用coalesce)或者想要在同一列中组合实体(使用UNION),请稍微取决于。