连接两列数据

Posted

技术标签:

【中文标题】连接两列数据【英文标题】:Concatenate two column data 【发布时间】:2014-06-28 09:53:12 【问题描述】:

我有下表。

现在在上表中 ENO,ENAME,Edept 是现有的列。现在我想计算上面的最后一列。

请帮助我查询以获得 FINAL 列结果。

提前致谢!!

【问题讨论】:

您是说enoenameedept 都是包含管道分隔值集的varchar2 列吗?你想产生一个管道和逗号分隔的结果?您意识到这违反了正确数据库设计的最后一条规则,对吗? 是的,都是 varchar。我没有其他选择,因为下游系统需要这种数据。 如果您可以提取并以期望的格式发送它,下游服务器需要什么并不一定重要。这不应该影响您自己存储数据的方式。该表是从其他按关系组织的表中填充的吗?如果是这样,它是如何填充的 - 它实际上是一个使用 listagg() 的视图吗? 每列的字段数(管道数)是固定的还是可变的?我手头没有要测试的数据库,但我的第一个想法是,如果管道的数量是固定的并且很小,那么类似于: 字段数可变 【参考方案1】:

您可以像这样混合使用 SUBSTR 和 INSTR 函数 -

查看演示:http://sqlfiddle.com/#!4/ad1d4/40/0

select substr(eno,1,instr(eno,'|',1,1)-1)
       ||','||
       substr(ename,1,instr(ename,'|',1,1)-1)
       ||','||
       substr(edept,1,instr(edept,'|',1,1)-1)
       ||'|'||
       substr(eno,instr(eno,'|',1,1)+1,instr(eno,'|',1,2)-3)
       ||','||
       substr(ename,instr(ename,'|',1,1)+1,instr(ename,'|',1,2)-3)
       ||','||
       substr(edept,instr(edept,'|',1,1)+1,instr(edept,'|',1,2)-3)
       ||
       substr(eno,instr(eno,'|',1,2)+1,length(eno)-instr(eno,'|',1,2)+1)
       ||','||
       substr(ename,instr(ename,'|',1,2)+1,length(ename)-instr(ename,'|',1,2)+1)
       ||','||
       substr(edept,instr(edept,'|',1,2)+1,length(edept)-instr(edept,'|',1,2)+1)
as final_column
from tbl

【讨论】:

仅当每个连接列中恰好有三个值时 (it breaks with 4)。可以使它更通用,但修复数据模型会更好。【参考方案2】:

如果您有经常需要。如果该表没有太多其他查询。

您可以在表中添加 FINAL 列并在其上添加触发器 喜欢:

CREATE OR REPLACE TRIGGER schema.TBI_name
BEFORE INSERT OR UPDATE
ON schema.TBLE_name 
FOR EACH ROW
DECLARE
BEGIN
        :NEW.FINAL := 1||','||
                   REPLACE(:NEW.eno,'|',',')
                   ||'|'||2||','||
                   REPLACE(:NEW.ename,'|',',')
                   ||'|'||3||','||
                   REPLACE(:NEW.edept,'|',',');
END TBI_name;

【讨论】:

以上是关于连接两列数据的主要内容,如果未能解决你的问题,请参考以下文章

连接熊猫数据框中的两列

连接单独处理的火花数据帧的两列时的顺序保证是啥?

如何在 Pandas 中连接包含列表(系列)的两列

如何基于每个数据框中具有不同名称的两列将两个数据框与 dplyr 连接起来? [复制]

MySQL在两列上左连接

使用 PySpark 连接与另一列中的两列确定的范围相匹配的数据框