SQL json_table 行转列方法

把一个逗号分隔的字符串拆成多行
sql 复制代码
select t.coins , jt.coin
     from (select 'BTC,ETH,BCH,ETC,TUSDT,ORDI,NEO' coins) t
     join json_table(
            concat('["', replace(t.coins, ',', '","'), '"]'),
            '$[*]' columns(coin varchar(100) path '$')
     ) as jt
sql 复制代码
json_table(
    <json_文档>,          -- ①
    <根路径>              -- ②
    columns(
        <列名> <类型> path '<列路径>',  -- ③
        ...
    )
)

三个参数分别控制:数据源、遍历粒度、输出列

步骤 1: 把逗号字符串转成 JSON 数组

sql 复制代码
concat('["', replace(t.coins, ',', '","'), '"]')
-- replace:  'BTC,ETH,SOL' → 'BTC","ETH","SOL'
-- concat:   → '["BTC","ETH","SOL"]'

步骤 2: json_table 摊开 JSON 数组

sql 复制代码
json_table(
    '["BTC","ETH","SOL"]',   -- 参数①:JSON 文档
    '$[*]'                   -- 参数②:根路径 = "数组中每个元素"
    columns(
        coin varchar(100) path '$'  -- 参数③:每行输出一列 coin,值=当前元素
    )
) as jt

参数值含义

  • ① JSON 文档 ["BTC","ETH","SOL"] 要解析的 JSON
  • ② 根路径 $[*] 遍历数组每个元素 3 个元素 → 产 3 行
  • ③ path $ 取当前元素本身 相对路径,$ = 当前迭代项

输出结果(jt 表):

sql 复制代码
coin
----
BTC
ETH
SOL

步骤 3: JOIN 形成最终结果

json_table 是 LATERAL JOIN 语义------左侧每一行,右侧展开出多行。最终:

t.coins jt.coin
BTC,ETH,SOL BTC
BTC,ETH,SOL ETH
BTC,ETH,SOL SOL

关键点解释:

概念 说明
$[*] 数组级别遍历------N 个元素产生 N 行
path '$' 列级别取值------$ 是相对于根路径的,即当前元素的值
嵌套对象 如果数组里是对象 {"name":"a"},{"name":"b"},可以用 path '$.name' 提取字段
等价关系 相当于 MySQL 的 JSON_TABLE()、Oracle 的 JSON_TABLE、StarRocks 原生支持
json DEMO 1
sql 复制代码
json_table(
    '[{"name":"BTC","price":50000},{"name":"ETH","price":3000}]',
    '$[*]'
    columns(
        name  varchar(100) path '$.name',
        price decimal(18,2) path '$.price'
    )
)
-- 输出: name=BTC,price=50000 / name=ETH,price=3000
嵌套DEMO 2
bash 复制代码
json_table(
    doc,
    '$' columns(
        id int path '$.id',
        nested path '$.items[*]' columns(
            item_name varchar(100) path '$.name'
        )
    )
)
相关推荐
知识的搬运工旺仔13 小时前
CREATE INDEX CONCURRENTLY:线上建索引不阻塞 DML 的代价与坑
数据库·后端·sql
天天喝旺仔14 小时前
MySQL索引优化实战:B+Tree原理、索引失效与覆盖索引调优
数据库·sql·mysql·性能优化
迷枫71216 小时前
MySQL 迁移到达梦过程中遇到的一些问题记录
sql
Lucifer三思而后行1 天前
Oracle SQL 优化实战:明明走了索引,SQL 还是慢?
sql·oracle
泡泡鱼(敲代码中)1 天前
MySQL 学习笔记:DCL、函数与约束 —— 安全、效率、完整性的三板斧
开发语言·笔记·sql·学习·mysql·gitee
润乾软件1 天前
SQLazy: 在分组内搜索指定偏移量的相邻记录
sql·sqlazy
隔窗听雨眠2 天前
SQL分页优化深度实战:从深分页性能瓶颈到等价改写完整方案
sql·sql优化
旺仔不是程序员2 天前
判断存在用 LIMIT 1:PostgreSQL 五种 count 计数方式与 NULL 语义
数据库·后端·sql
旺仔不是程序员2 天前
IN 操作规范:PostgreSQL 元素数量、EXISTS 替代与 = ANY 写法
数据库·后端·sql