You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何编写查询返回指定格式的子表并统一字段类型为字符串?

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)
  • 行拆分: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 08:34:17