PostgreSQL拆分JSON数组列为多字段的SELECT语句实现
当然可以搞定!具体怎么写SELECT语句得看你用的是哪种数据库,我给你整理了几种主流数据库的实现方案,直接套用就行:
MySQL(5.7+版本)
MySQL从5.7开始原生支持JSON操作,你可以用->>运算符(自动去除字符串引号)快速提取数组里的属性值:
SELECT Company, User->>'$[0].Name' AS User_1_name, User->>'$[0].email' AS User_1_email, User->>'$[0].password' AS User_1_password, User->>'$[1].Name' AS User_2_name, User->>'$[1].email' AS User_2_email, User->>'$[1].password' AS User_2_password FROM your_table_name;
如果习惯用函数写法,也可以替换成JSON_UNQUOTE(JSON_EXTRACT(User, '$[0].Name')),效果完全一致。
PostgreSQL
PostgreSQL对JSON的支持非常灵活,假设你的User列是文本类型,先转成JSON再提取:
SELECT Company, (User::json -> 0 ->> 'Name') AS User_1_name, (User::json -> 0 ->> 'email') AS User_1_email, (User::json -> 0 ->> 'password') AS User_1_password, (User::json -> 1 ->> 'Name') AS User_2_name, (User::json -> 1 ->> 'email') AS User_2_email, (User::json -> 1 ->> 'password') AS User_2_password FROM your_table_name;
如果User列已经是json或jsonb类型,直接去掉::json转换即可。
SQL Server(2016+版本)
SQL Server 2016及以后版本支持JSON函数,用JSON_VALUE指定路径提取值:
SELECT Company, JSON_VALUE(User, '$[0].Name') AS User_1_name, JSON_VALUE(User, '$[0].email') AS User_1_email, JSON_VALUE(User, '$[0].password') AS User_1_password, JSON_VALUE(User, '$[1].Name') AS User_2_name, JSON_VALUE(User, '$[1].email') AS User_2_email, JSON_VALUE(User, '$[1].password') AS User_2_password FROM your_table_name;
补充说明
上面的方案是针对你示例中每个公司固定2个用户的情况,如果未来用户数量不固定(可能多/少于2个),这种固定列的写法就不太灵活了,那时需要结合动态SQL或者行转列的逻辑来处理,但目前来看你的需求用上面的语句完全可以满足。
内容的提问来源于stack exchange,提问作者Vivo
相关产品推荐
相关产品推荐

