如何将所有表的列连接为分隔格式,而不单独指定每一列
Posted
技术标签:
【中文标题】如何将所有表的列连接为分隔格式,而不单独指定每一列【英文标题】:How to concatenate all tables' columns to a delimited format, without specifying each column separately 【发布时间】:2017-03-14 21:59:31 【问题描述】:例如
给定一个只有原始类型的表,例如-
create table t (i int, dt date, str string, ts timestamp, bl boolean)
;
insert into t
select 1,date '2017-03-14','Hello world',timestamp '2017-03-14 14:37:28.889',true
;
select * from t
;
+-----+------------+-------------+-------------------------+------+
| t.i | t.dt | t.str | t.ts | t.bl |
+-----+------------+-------------+-------------------------+------+
| 1 | 2017-03-14 | Hello world | 2017-03-14 14:37:28.889 | true |
+-----+------------+-------------+-------------------------+------+
... 和 |||
作为请求的分隔符
(为简单起见,我们可以假设它没有出现在数据中的任何位置)
请求的结果将是一个单独的分隔字符串
1|||2017-03-14|||你好世界|||2017-03-14 14:37:28.889|||真
【问题讨论】:
【参考方案1】:此解决方案仅限于仅包含“原始”类型的表(无结构、数组、映射等)。
select printf(concat('%s',repeat('|||%s',field(unhex(1),*,unhex(1))-2)),*)
from t
;
1|||2017-03-14|||你好世界|||2017-03-14 14:37:28.889|||真
附言
concat(*)
有效,但值没有用分隔符分隔。concat_ws(...,*)
产生异常。
【讨论】:
以上是关于如何将所有表的列连接为分隔格式,而不单独指定每一列的主要内容,如果未能解决你的问题,请参考以下文章