如何编写查询返回指定格式的子表并统一字段类型为字符串?
Got it!针对你需要将源表转换为指定键值对格式的需求,我整理了几种通用和数据库专属的SQL实现方案,确保满足key格式要求且所有字段统一转为字符串类型:
通用SQL方案(支持绝大多数数据库)
这是兼容性最强的写法,通过UNION ALL将每行源数据拆分为两行目标数据,同时完成key拼接和类型转换:
SELECT CONCAT('Name_', object, '_1') AS key, CAST(attribute1 AS VARCHAR) AS value FROM your_table UNION ALL SELECT CONCAT('Name_', object, '_2') AS key, CAST(attribute2 AS VARCHAR) AS value FROM your_table ORDER BY key; -- 可选:按key排序,保证输出顺序与示例一致
关键逻辑说明:
- key拼接:
CONCAT('Name_', object, '_1')按照Name_<对象>_<属性序号>的规则生成key,比如对象A的第一个属性会得到Name_A_1 - 类型统一:
CAST(attribute1 AS VARCHAR)将布尔值、数字等不同类型的字段转换为字符串,不同数据库可按需调整:- MySQL:替换为
CAST(attribute1 AS CHAR) - PostgreSQL:替换为
CAST(attribute1 AS TEXT)
- MySQL:替换为
- 行拆分:
UNION ALL合并两个查询结果,将每行源数据拆分为对应两个属性的两行记录
数据库专属优化写法
如果使用特定数据库,还可以用更简洁的语法实现:
PostgreSQL 版本
利用数组和UNNEST函数简化代码,避免重复编写查询逻辑:
SELECT CONCAT('Name_', object, '_', idx) AS key, CAST(val AS TEXT) AS value FROM your_table, UNNEST(ARRAY[attribute1, attribute2]) WITH ORDINALITY AS attrs(val, idx);
UNNEST(ARRAY[attribute1, attribute2])会将两个属性转为数组元素,WITH ORDINALITY自动为每个元素分配序号(1和2),直接用于key拼接。
MySQL 8.0+ 版本
借助JSON函数JSON_TABLE实现行拆分:
SELECT CONCAT('Name_', t.object, '_', j.idx) AS key, CAST(j.val AS CHAR) AS value FROM your_table t, JSON_TABLE( JSON_ARRAY(t.attribute1, t.attribute2), '$[*]' COLUMNS( val JSON PATH '$', idx INT PATH '$[ordinality]' ) ) j;
以上所有方案执行后,都会输出与你期望完全一致的子表结构,且所有value字段均为字符串类型。
内容的提问来源于stack exchange,提问作者Etian Chamay
相关产品推荐
相关产品推荐

