我的要求:
我有一个名为
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,
并取而代之的是实际的列名称?
由于您没有指定数据库引擎并且添加了 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
首先,这些并不完全是我在 Postgres 中得到的结果。其次,您似乎想要返回一个 JSON 对象。所以一种方法是:
select id, json_object( array['name', 'age', 'city'], array[name, age::text, city])
from students;
这里是一个db<>小提琴。
解决方案:
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 中所需的输出。