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'
        )
    )
)
相关推荐
网管NO.12 小时前
子查询进阶|EXISTS/IN/ANY/ALL,优化查询效率
数据库·sql
yuzhiboyouye5 小时前
sql增删改查怎么写?有时会不会有联表查询的增删查改
数据库·sql
IvorySQL5 小时前
【HOW 2026 分论坛演讲】PG/IvorySQL私有云中实践
数据库·人工智能·sql·postgresql
*neverGiveUp*9 小时前
PostgreSql常用SQL大全
数据库·sql·postgresql
六月雨滴11 小时前
SQL 索引优化
数据库·sql·oracle·dba
Boop_wu12 小时前
[Java EE进阶] 博客系统
数据库·sql
这个DBA有点耶12 小时前
SQL改写实战(续):子查询vs JOIN的深层原理
数据库·sql
持敬chijing13 小时前
Web渗透之SQL注入-盲注(布尔盲注,时间盲注)
前端·sql·oracle