我从拥有零售和企业客户的桌子中进行选择。我希望我的结果集在一列中返回公司和零售客户的名称。目前我将它们返回两个不同的列,如下所示:
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;
我正在尝试做什么可能以及如何在不必为零售和其他公司客户返回不同列的情况下实现此目标?
答案 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中,nvl
与coalesce
的表现非常相似,具有以下重要区别:
nvl
只需要2个参数,而合并可以采用 n 参数nvl
将评估其所有参数,但coalesce
将按顺序评估每个参数,当它达到非空值时停止(在其他单词,coalesce
将使用短路评估,但nvl
不会。)这一点非常重要,因为您经常会看到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
),请稍微取决于。