为了账号安全,请及时绑定邮箱和手机立即绑定

如何使用javascript从oracle获取数据到嵌套的json对象?

如何使用javascript从oracle获取数据到嵌套的json对象?

米脂 2023-07-14 09:44:34
我当前的json格式是这样的:{  {    'id' : 61,    'item' : 'apple pie,banana split',    'quantity' : '2,1',    'price' : '100000,50000'   },  {    'id' : 62,    'item' : 'beef steak,salad',    'quantity' : '1,2',    'price' : '50000,100000'  }}我想要的是这样的:{  {    'id' : 61,    'item' :             {              '1': {'name': 'apple pie', 'quantity' : '2','price': '100000'},              '2': {'name': 'banana split', 'quantity' : '1','price': '50000'}        }  },  {    'id' : 62,    'item' :             {              '1': {'name': 'beef steak', 'quantity' : '1','price': '50000'},              '2': {'name': 'salad', 'quantity' : '2','price': '100000'}        }  }}我的数据库是这样的:split_id  item                      quantity  price61        apple pie~|~banana split  2~|~1     100000~|~5000062        beef steak~|~salad        1~|~2     50000~|~100000我使用“~|~”,因为如果我使用“,”,那么它将被识别为查询中的下一列值。我不会创建一个新行来避免商品、数量和价格的多个值,因为它代表不同的交易。我找到了这个问题的答案,但它是在 php 和 mysql 中。我找不到 javascript 和 oracle 的。我很感谢对这个问题的任何帮助。谢谢。
查看完整描述

2 回答

?
茅侃侃

TA贡献1842条经验 获得超21个赞

在 Oracle 中,您可以拆分逗号分隔的字符串,然后聚合为 JSON:


WITH bounds ( id, idx, item, i_start, i_end, quantity, q_start, q_end, price, p_start, p_end ) AS (

  SELECT split_id,

         1,

         item,

         1,

         INSTR( item, '~|~', 1 ),

         quantity,

         1,

         INSTR( quantity, '~|~', 1 ),

         price,

         1,

         INSTR( price, '~|~', 1 )

  FROM   table_name t

UNION ALL

  SELECT id,

         idx + 1,

         item,

         CASE i_end WHEN 0 THEN 0 ELSE i_end + 3 END,

         CASE i_end WHEN 0 THEN 0 ELSE INSTR( item, ',', i_end + 3 ) END,

         quantity,

         CASE p_end WHEN 0 THEN 0 ELSE q_end + 3 END,

         CASE p_end WHEN 0 THEN 0 ELSE INSTR( quantity, ',', q_end + 3 ) END,

         price,

         CASE q_end WHEN 0 THEN 0 ELSE p_end + 3 END,

         CASE q_end WHEN 0 THEN 0 ELSE INSTR( price, ',', p_end + 3 ) END

  FROM   bounds

  WHERE  i_end > 0

  OR     q_end > 0

  OR     p_end > 0

),

split_data ( items ) AS (

  SELECT JSON_OBJECT(

           KEY 'id' VALUE id,

           KEY 'items' VALUE

             JSON_OBJECTAGG(

               KEY   TO_CHAR( idx )

               VALUE JSON_OBJECT(

                       KEY   'item'

                       VALUE CASE

                             WHEN i_start > 0 AND i_end = 0

                             THEN SUBSTR( item, i_start )

                             ELSE SUBSTR( item, i_start, i_end - i_start )

                             END,

                       KEY   'quantity'

                       VALUE TO_NUMBER(

                               CASE

                               WHEN q_start > 0 AND i_end = 0

                               THEN SUBSTR( quantity, q_start )

                               ELSE SUBSTR( quantity, q_start, q_end - q_start )

                               END

                             ),

                       KEY   'price'

                       VALUE TO_NUMBER(

                               CASE

                               WHEN p_start > 0 AND p_end = 0

                               THEN SUBSTR( price, p_start )

                               ELSE SUBSTR( price, p_start, p_end - p_start )

                               END

                             )

                    )

                    RETURNING CLOB

              )

        )

  FROM   bounds

  GROUP BY id

)

SELECT JSON_ARRAYAGG(

         items FORMAT JSON

         RETURNING CLOB

       ) AS value

FROM   split_data;

其中,对于样本数据:


CREATE TABLE table_name ( split_id, item, quantity, price ) AS

SELECT 61, 'apple pie~|~banana split', '2~|~1', '100000~|~50000' FROM DUAL UNION ALL

SELECT 62, 'beef steak~|~salad',       '1~|~2', '50000~|~100000' FROM DUAL;

输出:


VALUE

----------------------------------------

[

  {

    "id" : 61,

    "items" :

    {

      "1" :

      {

        "item" : "apple pie",

        "quantity" : 2,

        "price" : 100000

      },

      "2" :

      {

        "item" : "banana split",

        "quantity" : 1,

        "price" : 50000

      }

    }

  },

  {

    "id" : 62,

    "items" :

    {

      "1" :

      {

        "item" : "beef steak",

        "quantity" : 1,

        "price" : 50000

      },

      "2" :

      {

        "item" : "salad",

        "quantity" : 2,

        "price" : 100000

      }

    }

  }

]

db<>


查看完整回答
反对 回复 2023-07-14
?
翻翻过去那场雪

TA贡献2065条经验 获得超14个赞

您当前的 JSON 对象格式错误。您可以将其设为数组,以使其更加简单。你可以这样做:


var data = [ { 'id' : 61, 'item' : 'apple pie,banana split', 'quantity' : '2,1', 'price' : '100000,50000', }, { 'id' : 62, 'item' : 'beef steak,salad', 'quantity' : '1,2', 'price' : '50000,100000', }];


var result = data.map(({id,...rest})=>({id, items:Array.from({length:2},(_,i)=>Object.fromEntries(Object.entries(rest).map(([k,v])=>[k,v.split(',')[i]])))}));


console.log(result);


这里我使用和map的组合来创建一个对象。您可以看到是硬编码的,但您可以相应地更改它。fromEntriesentriesArray.fromlength:2


查看完整回答
反对 回复 2023-07-14
  • 2 回答
  • 0 关注
  • 115 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信