把一个逗号分隔的字符串拆成多行
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'
)
)
)