sql - Oracle 从 JSON 数组中选择
问题描述
我有一个用于一些“设置”的表,在该表中我有一个带有 json 数组的记录。这是一个简单的数组,如下所示:
"['scenario1','scenario2','scenario3']"
我想在视图中使用子选择语句来提取此信息,以便我可以像这样使用它:
select * from table where field_scenario in (select ????? from settings_table where this=that)
我一直在查看文档并为此进行谷歌搜索,但是对于我的一生,我无法弄清楚如何将返回的数组“旋转”成单个元素以使用它。
我相信Oracle 12c,在此先感谢。
解决方案
不要使用正则表达式来解析 JSON。使用正确的 JSON 解析器:
select *
from table_name
where field_scenario in (
SELECT j.value
FROM settings_table s
OUTER APPLY (
SELECT value
FROM JSON_TABLE(
s.json,
'$[*]'
COLUMNS(
value VARCHAR2(50) PATH '$'
)
)
) j
)
其中,对于样本数据:
CREATE TABLE settings_table ( json CLOB CHECK ( json IS JSON ) );
INSERT INTO settings_table ( json ) VALUES ( '["scenario1","scenario2","scenario3"]');
INSERT INTO settings_table ( json ) VALUES ( '["scenario5"]');
INSERT INTO settings_table ( json ) VALUES ( '["scenario \"quoted\""]');
INSERT INTO settings_table ( json ) VALUES ( '["scenario2,scenario4"]');
CREATE TABLE table_name ( id, field_scenario ) AS
SELECT LEVEL, 'scenario'||LEVEL FROM DUAL CONNECT BY LEVEL <= 6 UNION ALL
SELECT 7, 'scenario "quoted"' FROM DUAL;
输出:
身份证 | FIELD_SCENARIO -: | :---------------- 1 | 场景1 2 | 场景2 3 | 场景3 5 | 情景5 7 | “引用”的场景
db<>在这里摆弄
推荐阅读
- jinja2 - 在 dbt 模型中使用 if 块
- stata - 在Stata中拆分值并将它们保存在一个新变量中
- mysql - 在 MySQL 中,CHAR() 函数工作起来很奇怪
- ios - 使用 iOS 进行 LAN 游戏 - VPN 服务器在广播数据包时遇到问题
- angular - Angular 11 中未激活子路由
- html - html(引导页面)中的视频横幅布局不正确
- python - 灰色错误 = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY
- swift - 两个问题 1. 没有辅助结果 2. 无法插入新的连接插座
- arrays - 如何在“C”中的任何函数内声明全局变量?
- ssh-tunnel - 使用 PgAdmin 4 设置 SSH 隧道