连接两列数据
Posted
技术标签:
【中文标题】连接两列数据【英文标题】:Concatenate two column data 【发布时间】:2014-06-28 09:53:12 【问题描述】:我有下表。
现在在上表中 ENO,ENAME,Edept 是现有的列。现在我想计算上面的最后一列。
请帮助我查询以获得 FINAL 列结果。
提前致谢!!
【问题讨论】:
您是说eno
、ename
和edept
都是包含管道分隔值集的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;
【讨论】:
以上是关于连接两列数据的主要内容,如果未能解决你的问题,请参考以下文章