Row_to_json के साथ JSON बनाते समय विशेषताओं के नाम सेट करें


24

क्या केवल कुछ स्तंभों के लिए फ़ंक्शन f1, f2, f3...का उपयोग row_to_jsonकरते समय डिफ़ॉल्ट नामों का नाम बदलना संभव है ?

मैं कर सकता हूँ

row_to_json(customers)

लौटने

{"id_customer":2,"first_name":"bla","last_name":"second_bla"}

लेकिन अगर मुझे केवल बिना नाम चाहिए id_customer, तो मुझे उपयोग करना होगा

row_to_json(row(first_name, last_name))

और फिर मुझे मिलता है

{"f1":"bla","f2":"second_bla"}

और मैं इस परिणाम को डिफ़ॉल्ट कॉलम नामों या अपने स्वयं के साथ प्राप्त करना चाहूंगा। मुझे पता है कि मैं अपना कंपोजिट टाइप और उपयोग कर सकता हूं

row_to_json(row(first_name, last_name))::my_custom_type

लेकिन क्या उस प्रकार का निर्माण किए बिना इसे सही तरीके से करना संभव नहीं है?


1
इसके अलावा, देखें: संदर्भ 1 और संदर्भ 2 समान के लिए
माइकएम

जवाबों:


17

एक सामान्य टेबल एक्सप्रेशन आपको उपनामों को स्पष्ट रूप से निर्दिष्ट करने की अनुमति देता है, न केवल सीटीई के लिए बल्कि इसके स्तंभों के लिए भी।

WITH data(col1,col2,cola,colb) AS (
  VALUES (1,2,'fred','bob')
)
SELECT row_to_json(data) FROM data;

यह @ dezso के उदाहरण से भिन्न है कि यह सूची col AS aliasमें प्रत्येक कॉल के लिए उपयोग नहीं करता है SELECT; यह सीटीई तालिका उपनाम में कॉलम नामों को उपनाम देता है।

मैंने एक VALUESअभिव्यक्ति को एक उप-वर्ग के रूप में उपयोग किया है लेकिन आप SELECTजो चाहें उपयोग कर सकते हैं ; मुद्दा यह है कि स्तंभ-नाम में जो कुछ भी उपलब्ध कराया गया है या मान लिया गया है उसे स्तंभ-नाम-सूची निर्दिष्ट करके सीटीई परिभाषा में ओवरराइड किया जा सकता है।

आप उपयोग करने के बजाय फिर से एक सबक्वेरी में एक ही काम कर सकते हैं AS alias:

SELECT row_to_json(data) 
FROM (VALUES (1,2,'fred','bob')) data(col1,col2,cola,colb);

यह ROWसीधे अभिव्यक्ति के साथ काम नहीं करता है ; आप केवल ROWएक ठोस प्रकार के लिए एक कास्ट कर सकते हैं, आप इसे उपनाम नहीं दे सकते।

regress=> SELECT ROW(1,2,'fred','bob') AS x(a,b,c,d);
ERROR:  syntax error at or near "("
LINE 1: SELECT ROW(1,2,'fred','bob') AS x(a,b,c,d);

क्या हमारे समाधानों (उपयोग, प्रदर्शन, आदि) के बीच कोई अंतर है (शैली और / या पठनीयता के अलावा)?
dezso

@dezso नहीं, और मुझे शायद सिर्फ एक टिप्पणी पोस्ट करनी चाहिए थी। माफ़ कीजिये।
क्रेग रिंगर

मुझे लगता है कि यह ठीक है। मैंने आपके उत्तर को भी b / c में उतारा है, इसमें उपयोगी जानकारी है जो मेरी नहीं है।
dezso

क्या कॉलम उपनामों को गतिशील रूप से प्राप्त करने के लिए एक वाक्यविन्यास है? मैं एक ईएवी (इकाई विशेषता मान) स्कीमा से खींच रहा हूं जहां वांछित प्रमुख नाम भी एट्रिब्यूट.नाम कॉलम से चुने गए हैं।
क्रिस

@ क्रिस आपको 9.4 में अधिक परिष्कृत जोंस कार्यों की आवश्यकता होगी।
क्रेग रिंगर

23
select 
   c.id,
   (select row_to_json(_) from (select c.first_name, c.last_name) as _) as first_last,
   c.age
from
   customers as c

बिना किसी प्रदर्शन प्रभाव के आप जो चाहते हैं वह करेंगे (और बहुत अधिक क्रिया नहीं है):

  id  |   first_last                                |   age
------+---------------------------------------------+---------
  1   | {"fisrt_name": "John", "last_name": "Smit"} |   34

4
यह उत्तर एक रत्न है।
टिफ़न

बहुत बहुत धन्यवाद आपने मेरी दोपहर को बचाया, बहुत बुरा यह पोस्टग्रेसीक्यूएल एपीआई में उद्धृत उदाहरण नहीं है। मुझे पता था कि यह संभव है
jlandercy

9

आप ऐसा कुछ कर सकते हैं:

WITH r AS (
  SELECT 'bla' AS name1, 'otherbla' AS name2
)
SELECT row_to_json(r.*)
FROM r
;

(बेशक, वही हासिल किया जा सकता है

SELECT row_to_json(r.*)
FROM (SELECT 'bla' AS name1, 'otherbla' AS name2) r
;

लेकिन मैंने पूर्व को अधिक पठनीय पाया।)

में WITHहिस्सा आप मक्खी पर किसी भी संरचना की पंक्तियों का निर्माण कर सकते हैं।


जोंसब के साथ नॉन-जोंसब को सम्‍मिलित करने के लिए: SELECT row_to_json (r। *) FROM (SELECT c1, c2 :: jsonb FROM us_ca_monterey_aoc.test) के रूप में r
एंड्रयू स्कॉट इवांस

9

आप उपयोग कर सकते हैं json_build_object

SELECT 
  json_build_object('id', data.customer_id, 'first_name', data.first_name, 'last_name', data.last_name) as your_json
FROM data;
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.