Oracle-JSON查询全选

2022-04-14 00:00:00 json sql oracle12c oracle

在Oracle 12c上,我有一个表,其中有一列包含JSON字符串,没有嵌套的JSON数据。

我希望选择所有JSON数据,而不必指定每个属性,如果值不是字符串,是否可以将其转换为字符串?

SELECT
   jt.*
FROM
   my_table,
   JSON_TABLE ( my_json_col, '$'
         COLUMNS (
            row_number FOR ORDINALITY,
            phone_type VARCHAR2 ( 10 ) PATH '$.type',
            phone_num VARCHAR2 ( 20 ) PATH '$.number'
         )
      )
   AS jt
WHERE
   user = '83';

示例数据:

{
  "user_name": "Dave",
  "phone_number": "13326415",
  "married": false,
  "age": 18
}

预期结果:

user_name   phone_number   married   age
"Dave"      "13326415"     "false"   "18"

解决方案

使用纯SQL Select语句没有动态方法,但这样的PL/SQL代码块可能是一个选项,以便按需要显示

DECLARE
  v_js_data     my_table.my_json_col%TYPE;
  v_js_obj      JSON_OBJECT_T;
  v_js_obj_list JSON_KEY_LIST;
  v_title       VARCHAR(4000);
  v_value       VARCHAR(4000);  
BEGIN
  SELECT my_json_col INTO v_js_data FROM my_table WHERE user_id = 83;

  v_js_obj := JSON_OBJECT_T.PARSE(v_js_data);
  v_js_obj_list := v_js_obj.get_keys;

  FOR c IN 1 .. v_js_obj_list.COUNT 
  LOOP
    v_title := v_title||RPAD(v_js_obj_list(c),20,' '); 
    v_value := v_value||RPAD(v_js_obj.GET_STRING(v_js_obj_list(c)),20,' '); 
  END LOOP;  
  DBMS_OUTPUT.PUT_LINE(v_title);
  DBMS_OUTPUT.PUT_LINE(v_value);
END;
/

Demo

相关文章