athena 将多列连接成一个 json 字符串

问题描述 投票:0回答:3

我的要求:

我有一个名为

students
的表,具有此架构

-----------------------
| id name age city   |
-----------------------
| 1  a     12  city1 |
| 2  b     13  city2 |
| 3  c     14  city3 |
| 4  d     15  city4 |
----------------------

我想要一个将返回以下结果的查询

---------------------------------------
 id               details            
---------------------------------------
 1  {name: a , age: 12 , city:city1} 
 2  {name: b , age: 13 , city:city2} 
 3  {name: c , age: 14 , city:city3} 
 4  {name: d  ,age: 15 , city:city4} 
---------------------------------------

我尝试了以下查询

select id,(name,age,city) as details from students

并收到此输出

---------------------------------------
 id               details            
---------------------------------------
 1  {field0: a , field1: 12 , field2:city1} 
 2  {field0: b , field1: 13 , field2:city2} 
 3  {field0: c , field1: 14 , field2:city3} 
 4  {field0: d  ,field1: 15 , field2:city4} 
---------------------------------------

谁能告诉我如何摆脱这个

field0,field1,field1,
并取而代之的是实际的列名称?

sql postgresql amazon-web-services amazon-athena
3个回答
1
投票

由于您没有指定数据库引擎并且添加了 Amazon Athena 的标签,因此 Athena 的语法如下:

WITH students AS
( SELECT 1 as id, 'a' as name, 12 as age, 'city1' as city UNION ALL 
  SELECT 2, 'b', 13, 'city2' UNION ALL
  SELECT 3, 'c', 14, 'city3' UNION ALL
  SELECT 4, 'd', 15, 'city4')

SELECT CAST(MAP_FROM_ENTRIES(
    ARRAY[
      ('name', name), 
      ('age', cast(age as varchar)), 
      ('city', city)
    ]) AS JSON) as details
FROM students

0
投票

首先,这些并不完全是我在 Postgres 中得到的结果。其次,您似乎想要返回一个 JSON 对象。所以一种方法是:

select id, json_object( array['name', 'age', 'city'], array[name, age::text, city])
from students;

这里是一个db<>小提琴。


0
投票

解决方案:

select a.id,cast(row(a.name,a.age,a.city) as row(name varchar,age int,city varchar)) as details from students a

它将为您提供 Athena 中所需的输出。

© www.soinside.com 2019 - 2024. All rights reserved.