【sql/python】表中某列值以列表聚合

需求背景:

有一个表含有两个字段

"ID","VALUE"

1,香蕉

1,苹果

2,橘子

3,香蕉

3,苹果

3,橘子

目标要求:将每个ID的VALUE列聚合成一个字符串列表

"ID","VALUE"

1,[香蕉,苹果]

2,[橘子]

3,[香蕉,苹果,橘子]

一、SQL使用 LISTAGG函数聚合方式

sql 复制代码
---将使用了LISTAGG函数来将每个ID的VALUE列聚合成一个字符串列表,列表中的元素按VALUE字段的顺序排序。
SELECT ID, LISTAGG(VALUE, ',') WITHIN GROUP (ORDER BY VALUE) AS VALUE_LIST
FROM  XXX表名
GROUP BY ID

关于排序的逻辑,想了解的见下回答

二、python连接远程数据库的方式,结果以JSON文件存在本地

也可以在pycharm客户端使用其他工具(如Python、JSON库等)来聚合数据并生成JSON,将数据导出到外部文件,然后给出代码如下:

bash 复制代码
import cx_Oracle
# 连接到Oracle数据库
dsn = cx_Oracle.makedsn('YOUR_HOST', 'YOUR_PORT', service_name='YOUR_SERVICE_NAME')
conn = cx_Oracle.connect(user='YOUR_USERNAME', password='YOUR_PASSWORD', dsn=dsn)
# 查询SQL
query = "select {number_column}, {value_column} FROM {table_name} where rownum<=5"
# 执行查询
cursor = conn.cursor()
cursor.execute(query)

# 初始化一个字典来聚合同一ID的所有VALUE
id_value_map = {}
# 遍历查询结果并填充字典
for row in cursor:
    # print(row)
    id, value = row
    if id in id_value_map:
        id_value_map[id].append(value)#同一个ID的VALUE值追加
    else:
        id_value_map[id] = [value]
        
# 转换为所需的JSON格式
json_data = [{"ID": k, "VALUE": v} for k, v in id_value_map.items()]
# 写入JSON文件
with open('output.json', 'w', encoding='utf-8') as json_file:
    json.dump(json_data, json_file, ensure_ascii=False, indent=4)
# 关闭数据库连接
cursor.close()
conn.close()

注意:表是普表,以上两种方法这么执行没有问题!但是,如果表中含有LOB类型字段(large object),即超长文本字段,方法一 二 就会报错 !!! 如果遇到"目标缓冲区太小,无法容纳字符集转换之后的 CLOB 数据"的错误,这通常意味着在执行LISTAGG函数时,生成的CLOB数据超出了数据库允许的缓冲区大小。

我们可以通过优化方法二中的部分代码来解决这个问题:

bash 复制代码
import cx_Oracle
# 连接到Oracle数据库
dsn = cx_Oracle.makedsn('YOUR_HOST', 'YOUR_PORT', service_name='YOUR_SERVICE_NAME')
conn = cx_Oracle.connect(user='YOUR_USERNAME', password='YOUR_PASSWORD', dsn=dsn)
# 查询SQL
query = "select {number_column}, {value_column} FROM {table_name} where rownum<=5"
# 执行查询
cursor = conn.cursor()
cursor.execute(query)

# 初始化一个字典来聚合同一ID的所有VALUE
id_value_map = {}
# 遍历查询结果并填充字典
for row in cursor:
    # print(row)
    id, lob_value = row
    # 假设我们想要读取整个LOB数据
    if lob_value is not None:#lob_value中存在空值,如果没有不需要加这个判断
        #使用lob_value.read()来读取LOB对象中的全部数据
        lob_value_str = lob_value.read()
        if id in id_value_map:
            id_value_map[id].append(lob_value_str)
        else:
            id_value_map[id] = [lob_value_str]
            
# 转换为所需的JSON格式
json_data = [{"ID": k, "NOTE": v} for k, v in id_value_map.items()]
# 写入JSON文件
with open('output_note_ydy.json', 'w', encoding='utf-8') as json_file:
    json.dump(json_data, json_file, ensure_ascii=False, indent=4)
# 关闭数据库连接
cursor.close()
conn.close()

if lob_value is not None:

因为我的表中lob_value中存在空值,所以需要加这个判断,不然就会报如下错误。

相关推荐
网小鱼的学习笔记几秒前
python中MongoDB操作实践:查询文档、批量插入文档、更新文档、删除文档
开发语言·python·mongodb
亲爱的非洲野猪8 分钟前
Oracle与MySQL详细对比
数据库·mysql·oracle
Q_Q51100828510 分钟前
python的保险业务管理与数据分析系统
开发语言·spring boot·python·django·flask·node.js·php
王小王-12318 分钟前
基于Python的程序员数据分析与可视化系统的设计与实现
python·数据挖掘·数据分析·招聘数据分析·程序员数据分析·招聘薪资数据分析·智联招聘可视化
昀贝1 小时前
Maven项目引用本地jar涉及scope和systemPath配置
python·maven·jar
Stuomasi_xiaoxin1 小时前
服务器重装后如何“复活”旧硬盘上的 Anaconda 环境?—— 一次完整的排错与恢复记录
开发语言·python·github
这里有鱼汤1 小时前
一招横盘突破选股法,赚钱不靠运气靠图形,靠概率!
后端·python
0wioiw01 小时前
Ubuntu基础(Python虚拟环境和Vue)
linux·python·ubuntu
xiao5kou4chang6kai42 小时前
Python-GEE遥感云大数据分析与可视化(如何建立基于云计算的森林监测预警系统)
python·数据分析·云计算·森林监测·森林管理