2

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

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;

我正在尝试做的事情可能吗?我如何才能实现这一点,而不必为零售返回不同的列,而为企业客户返回另一个列?

4

3 回答 3

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 中,其nvl性能与 非常相似coalesce,但有以下重要区别:

  1. nvl只需要 2 个参数,而 coalesce 可以带n 个参数
  2. 当函数或方程作为参数传递给它们时,nvl将评估其所有参数,但coalesce将按顺序评估每个参数,当它达到非空值时停止(换句话说,coalesce将使用短路评估,但nvl不会) .

这很重要,因为您经常会看到nvl用于类似目的。

于 2013-08-08T13:00:45.100 回答
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 
于 2013-08-08T13:05:19.087 回答
3

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

例如

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

于 2013-08-08T12:59:27.760 回答