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

如何拆分SQL Server表中JSON列至多列?SQL/Python方案咨询

方案选择与实现方法

两种方式都能满足需求,选择取决于你的场景:

  • 若需实时处理、超大数据量操作,或希望直接在数据库内完成转换,优先用SQL Server原生方案,无需额外环境,性能更优。
  • 若需复杂数据清洗、后续分析可视化,或JSON结构频繁变动,Python pandas更灵活,调试修改更便捷。

SQL Server 实现方法

你之前的问题是OPENJSON的WITH子句未指定正确的嵌套JSON路径,导致仅读取顶层结构。以下是正确写法:

SELECT
    t._id AS global_id,
    j.[_id.$oid],
    j.created_at,
    j.[from.nome],
    j.[from.id],
    j.nota
FROM myTable as t
CROSS APPLY OPENJSON(t.myColumn)
WITH (
    [_id.$oid] NVARCHAR(50) '$._id."$oid"', -- 带$的键需用双引号包裹
    created_at VARCHAR(50) '$.created_at',
    [from.nome] NVARCHAR(100) '$.from.nome',
    [from.id] NVARCHAR(100) '$.from.id',
    nota NVARCHAR(MAX) '$.nota'
) AS j;

存入新表的写法

若要将拆分结果直接存入新表,只需添加INTO子句:

SELECT
    t._id AS global_id,
    j.[_id.$oid],
    j.created_at,
    j.[from.nome],
    j.[from.id],
    j.nota
INTO normalized_json_data -- 新表名
FROM myTable as t
CROSS APPLY OPENJSON(t.myColumn)
WITH (
    [_id.$oid] NVARCHAR(50) '$._id."$oid"',
    created_at VARCHAR(50) '$.created_at',
    [from.nome] NVARCHAR(100) '$.from.nome',
    [from.id] NVARCHAR(100) '$.from.id',
    nota NVARCHAR(MAX) '$.nota'
) AS j;

Python pandas 实现方法

利用json_normalize快速展开嵌套JSON,步骤如下:

import pandas as pd
import pyodbc

# 1. 连接SQL Server读取原表数据
conn = pyodbc.connect('DRIVER={SQL Server};SERVER=你的服务器名;DATABASE=你的数据库;UID=账号;PWD=密码')
df = pd.read_sql_query("SELECT _id AS global_id, myColumn FROM myTable", conn)
conn.close()

# 2. 展开JSON数组并标准化嵌套字段
df['myColumn'] = df['myColumn'].apply(pd.read_json)  # 将JSON字符串转为列表
exploded_df = df.explode('myColumn').reset_index(drop=True)  # 展开数组
normalized_df = pd.json_normalize(exploded_df['myColumn'])  # 标准化嵌套结构

# 3. 关联原表global_id并整理列名
result_df = pd.concat([exploded_df[['global_id']], normalized_df], axis=1)
result_df.rename(columns={
    '_id.$oid': '_id.$oid',
    'created_at': 'created_at',
    'from.nome': 'from.nome',
    'from.id': 'from.id',
    'nota': 'nota'
}, inplace=True)

# 可选:将结果写回SQL Server
# from sqlalchemy import create_engine
# engine = create_engine('mssql+pyodbc://账号:密码@服务器/数据库?driver=SQL+Server')
# result_df.to_sql('normalized_json_data', engine, if_exists='replace', index=False)

print(result_df)

内容的提问来源于stack exchange,提问作者Vinícius Sodré Quadros

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 03:35:19