簡體   English   中英

Select 查詢使用 json 格式值

[英]Select query using json format value

如果客戶 first_name-'Monika',last_name='Awasthi'

然后我使用以下查詢以 json 格式返回值:

SELECT * 
  FROM
  (
   SELECT JSON_ARRAYAGG(JSON_OBJECT('CODE' IS '1','VALUE' IS 'Monika'||' '||'Awasthi'))
     FROM DUAL 
  );
        

它工作正常並在 output 以下給出:

[{"CODE":"1","VALUE":"Monika Awasthi"}]

但我想要一個應該反轉的值意味着 output 應該是:

[{"CODE":"1","VALUE":"Monika Awasthi"},{"CODE":"2","VALUE":"Awasthi Monika"}]

請給我一些建議。 謝謝你

通過使用SQL (不使用PL/SQL )的簡單邏輯,以便生成代碼值,因為在這種情況下可能僅可用於兩列

SELECT JSON_ARRAYAGG(
          JSON_OBJECT('CODE' IS tt.column_id,
                      'VALUE' IS CASE WHEN column_id=1 
                                      THEN name||' '||surname
                                      ELSE surname||' '||name
                                       END)
                    ) AS result
  FROM t
 CROSS JOIN (SELECT column_id FROM user_tab_cols WHERE table_name =  'T') tt

其中t是一個包含namesurname列的表

演示

通過使用PL/SQL可以提供更具彈性的解決方案,甚至更多列存在於數據源中,例如

DECLARE
 v_jso   VARCHAR2(4000);
 v_arr   OWA.VC_ARR; 
 v_arr_t JSON_ARRAY_T := JSON_ARRAY_T(); 
BEGIN
 FOR c IN ( SELECT column_id FROM user_tab_cols WHERE table_name = 'T' )
 LOOP
   SELECT 'JSON_OBJECT( ''CODE'' IS '||MAX(c.column_id)||',
                        ''VALUE'' IS '||LISTAGG(column_name,'||'' ''||') 
                                        WITHIN GROUP (ORDER BY ABS(column_id-c.column_id))
                                        ||' )'
     INTO v_arr(c.column_id)                                   
     FROM ( SELECT * FROM user_tab_cols WHERE table_name = 'T' );

   EXECUTE IMMEDIATE 'SELECT '||v_arr(c.column_id)||' FROM t' INTO v_jso;
   v_arr_t.APPEND(JSON_OBJECT_T(v_jso));
 END LOOP;

 DBMS_OUTPUT.PUT_LINE(v_arr_t.STRINGIFY);  
 
END;
/

演示

另一種方法是使用 CTE 生成兩個代碼和值; 可以編寫您的原始版本以從表或 CTE 中獲取名稱數據:

-- CTE for sample data
WITH cte (first_name, last_name) AS (
  SELECT 'Monika', 'Awasthi' FROM DUAL
)
-- query against CTE or table
SELECT JSON_ARRAYAGG(JSON_OBJECT('CODE' IS '1','VALUE' IS last_name ||' '|| first_name))
FROM cte;

然后,您可以使用 CTE 擴展它,該 CTE 生成具有兩個順序中名稱的值:

WITH cte1 (first_name, last_name) AS (
  SELECT 'Monika', 'Awasthi' FROM DUAL
),
cte2 (code, value) AS (
  SELECT 1 AS code, first_name || ' ' || last_name FROM cte1
  UNION ALL
  SELECT 2 AS code, last_name || ' ' || first_name FROM cte1
)
SELECT JSON_ARRAYAGG(JSON_OBJECT('CODE' IS code,'VALUE' IS value))
FROM cte2;

這使:

JSON_ARRAYAGG(JSON_OBJECT('CODE'ISCODE,'VALUE'ISVALUE))
-------------------------------------------------------------------------
[{"CODE":1,"VALUE":"Monika Awasthi"},{"CODE":2,"VALUE":"Awasthi Monika"}]

db<>小提琴

正如我在您的問題下的評論中解釋的那樣,我不清楚您如何定義 JSON 字符串的CODE值(假設您有多個客戶)。

除此之外,如果您需要從單個字符串創建一個 JSON 對象數組(如您的嘗試),您可能需要使用JSON_ARRAY而不是JSON_ARRAYAGG 就像我在下面展示的那樣。 順便說一句,我也不知道你為什么需要SELECT * FROM (subquery) - 外部SELECT似乎完全沒有必要。

因此,如果您實際上並未在表上進行聚合,而只需要從各個部分構建 JSON 數組:

select json_array
       (
         json_object('CODE' is '1', 'VALUE' is first_name || ' ' || last_name ),
         json_object('CODE' is '2', 'VALUE' is last_name  || ' ' || first_name)
       ) as result
from   ( select 'Monika' as first_name, 'Awasthi' as last_name from dual )
;

RESULT                                                                        
------------------------------------------------------------------------------
[{"CODE":"1","VALUE":"Monika Awasthi"},{"CODE":"2","VALUE":"Awasthi Monika"}]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM