2016-09-15 45 views
0

我想找到一個簡單的方法來生成一個SQL查詢作爲JSON,但我來了空白。這是查詢:減少Oracle查詢返回只是所有者

SELECT DISTINCT owner 
FROM dba_segments 
WHERE owner NOT IN ('SYS', 'SYSTEM', 'EXFSYS', 'DBSNMP', 'SQLTXPLAIN', 'XDB', 'WMSYS', 'PERFSTAT', 'OUTLN'); 

我想有這顯示什麼是JSON與此類似:

{ 
    "data": [{ 
     "{#Owner}": "ABC123Test" 
    }, { 
     "{#Owner}": "Accounting" 
    }, { 
     "{#Owner}": "Treasury" 
    }, { 
     "{#Owner}": "Production1" 
    }] 
} 

在SQL Server中,我只想利用XML PATH和做這樣的事情 -

SELECT '{"data":[' + (SELECT CAST(STUFF((SELECT ',' + '{"{#Owner}":"' + DISTINCT[owner] + '"}' 
FROM dba_segments 
where owner not in ('SYS', 'SYSTEM', 'EXFSYS', 'DBSNMP', 'SQLTXPLAIN', 'XDB', 'WMSYS', 'PERFSTAT', 'OUTLN') FOR XML PATH('')), 1, 1, '') AS VARCHAR(MAX))) + ']}' as 'XML_F52E2B61-18A1-11d1-B105-00805F49916B' 
+0

請注意,它應該全部爲大寫/宏變量名稱,如{#OWNER}。 – Richlv

回答

1

事情是這樣的:

SELECT '{ "data": [{'||listagg('"{#owner}":"'||owner||'"}', ',') within group (order by owner)||'}]}' as json 
FROM (
    select distinct owner 
    from dba_segments 
    WHERE owner NOT IN ('SYS', 'SYSTEM', 'EXFSYS', 'DBSNMP', 'SQLTXPLAIN', 'XDB', 'WMSYS', 'PERFSTAT', 'OUTLN', 'APEX_040200') 
) t; 

(不知道如果我得到了所有的{[右嵌套)

+0

我剛剛運行了查詢並獲得了以下 - 「{」DATA「:[{'|| LISTAGG('」{#OWNER}「:」'|| OWNER ||'「}',',')WITHINGROUP(ORDERBYOWNER)||'}]} '' – whoisearth

+0

@whoisearth:好吧,這是Oracle分配給表達式的默認名稱(我改變了查詢以提供列別名)。它應該返回一行JSON數據 - 除非系統中沒有用戶與派生表中的where子句相匹配。從不在(...)中的所有者返回的dba_segments中的select count(distinct owner)是什麼? –

+0

我要用甲骨文召喚我的無知。我跑了你的更新,它只顯示'JSON',但你說的是,如果我要在SQL開發中運行它實際上是顯示數據? – whoisearth

0

除非你想要一個真正的大項目,你真的不想推出自己的JSON解析器/編寫器。對於許多項目,我已經使用了PLJSON這是一個可以在PL/SQL中操縱/解析/寫入JSON的軟件包庫。我相信也有其他選擇,但是這對我來說表現很好。

編輯

看起來像12C,Oracle支持JSON。有關更多信息,請參見here

+0

Oracle 12中的JSON支持不會起作用,因爲它只啓用_query_ JSON文檔,但不會生成_generate_(例如,像Postgres中的row_to_json()或json_agg()) –

1

使用12.2.0.1.0這工作(注意,我不得不使用實現WITH子句以獲得正確結果)

SQL> set lines 89 
SQL> with DBA_SEGMENT_OWNERS 
    2 as 
    3 (
    4 select /*+ MATERIALIZE */ DISTINCT OWNER 
    5  from dba_segments 
    6  where owner NOT IN ('SYS', 'SYSTEM', 'EXFSYS', 'DBSNMP', 'SQLTXPLAIN', 'XDB', 'WMSYS', 'PERFSTAT') 
    7 ) 
    8 select JSON_OBJECT('data' is JSON_ARRAYAGG(JSON_OBJECT('{#Owner}' is OWNER))) 
    9 from DBA_SEGMENT_OWNERS 
10/
{"data":[{"{#Owner}":"MDSYS"},{"{#Owner}":"VPDTEST"},{"{#Owner}":"CTXSYS"},{"{#Owner}":"H 
R"},{"{#Owner}":"DVSYS"},{"{#Owner}":"AUDSYS"},{"{#Owner}":"SCOTT"},{"{#Owner}":"VPDOWNER 
"},{"{#Owner}":"GSMADMIN_INTERNAL"},{"{#Owner}":"OJVMSYS"},{"{#Owner}":"ORDSYS"},{"{#Owne 
r}":"ORDS_METADATA"},{"{#Owner}":"ORDDATA"},{"{#Owner}":"XDBEXT"},{"{#Owner}":"LBACSYS"}, 
{"{#Owner}":"XFILES"}]} 


SQL>