如何将所有表的列连接为分隔格式,而不单独指定每一列

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(...,*) 产生异常。

【讨论】:

以上是关于如何将所有表的列连接为分隔格式,而不单独指定每一列的主要内容,如果未能解决你的问题,请参考以下文章

如何拆分对象列表以分隔pyspark数据框中的列

在 Oracle SQL 中显示表的所有约束的名称

如何将日期时间分成单独的列? [复制]

如何将同时具有逗号和空格分隔符的 CSV 文件转换为只有空格分隔符的 csv

如何将逗号分隔的列值与另一个表作为行连接

如何在 r 中的可反应表的页脚(包含每列的总值)中添加分隔符?