首页 > 解决方案 > Oracle中如何连接字段?

问题描述

我有这张简单的桌子。

City            Country   State      Id
Great Falls      (null)   VA         12345
Great Falls      USA      VA         12345

我想在 Oracle 环境中使用以下运行代码的城市 + 国家 + 州的 CONCAT 函数。

SELECT City, Country, State, 
City ||', ' ||Country|| ', '||State AS Concat_fields
FROM #TEMP

City    Country    State       Concat_fields           Id
Great Falls (null) VA          Great Falls, , VA       12345
Great Falls USA    VA          Great Falls, USA, VA    12345

问题:有没有更好的方法可以更改查询以使其仅返回 1 条记录?我想这样展示我的结果:

City        Country State   Concat_fields           Id
Great Falls USA     VA       Great Falls, USA, VA   12345

有什么想法、批评、建议吗?

标签: oracle

解决方案


如果行之间的唯一区别是空值与非空值,那么您可以在连接之前使用聚合:

-- CTE for sample data
with "#TEMP" (city, country, state, id) as (
  select 'Great Falls', null, 'VA', 12345 from dual
  union all select 'Great Falls', 'USA', 'VA', 12345 from dual
)
-- actual query
select max(city) as city, max(country) as country, max(state) as state, 
  max(city) ||', ' ||max(country)|| ', '||max(state) as concat_fields
from "#TEMP"
group by id;

CITY        COU ST CONCAT_FIELDS       
----------- --- -- --------------------
Great Falls USA VA Great Falls, USA, VA

如果 ID 的行具有不同的非空值,那么这显然不起作用:

with "#TEMP" (city, country, state, id) as (
  select 'Great Falls', null, 'VA', 12345 from dual
  union all select 'London', 'UK', null, 12345 from dual
)
select max(city) as city, max(country) as country, max(state) as state, 
  max(city) ||', ' ||max(country)|| ', '||max(state) as concat_fields
from "#TEMP";

CITY        CO ST CONCAT_FIELDS      
----------- -- -- -------------------
London      UK VA London, UK, VA     

但是随后您将需要某种方法来确定哪一行是正确的 - 例如,如果这代表客户地址的历史记录并且您想要“最新”版本,则从序列或日期列中确定。那么诀窍就是知道如何确定哪个是“最新的”。


推荐阅读