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'
        )
    )
)
相关推荐
憧憬成为web高手14 小时前
皮卡丘靶场速通--sql 2
数据库·sql·mybatis
yio_yin20 小时前
Spring事务管理(数据一致性)
数据库·sql·spring
Csvn1 天前
📊 SQL 入门 Day 9:CTE(公用表表达式)— 让 SQL 像写代码一样优雅
后端·sql
虹科网络安全1 天前
艾体宝新闻|从 SQL 注入到服务器接管:CVE-2026-57517 暴露 Web 管理面板的供应链与安全编码风险
服务器·前端·sql
Databend1 天前
用 QUALIFY 写出更清晰的窗口函数 SQL
数据库·sql·数据分析
难寻安逸1 天前
DVWA-使用sqlmap 进行sql注入过程
数据库·sql·网络安全
Csvn1 天前
📊 SQL 入门 Day 8:集合操作 — 用 SQL 做数学里的"并交差"
后端·sql
Irene19912 天前
大数据开发的常见实践:把 SQL 直接写在 Shell 脚本里 ER图 数据血缘
sql·数据血缘·er
川石课堂软件测试2 天前
安全测试|常见SQL注入攻击方式、实例及预防
服务器·数据库·sql·功能测试·测试工具·安全·单元测试
qq_366086222 天前
sql 查询中关于 null 值判断的问题
数据库·sql