সারি_তো_জসন দিয়ে জেএসএন তৈরি করার সময় বৈশিষ্ট্যগুলিতে নামগুলি সেট করুন


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
এছাড়াও, দেখুন:
অনুরূপের

উত্তর:


17

একটি সাধারণ টেবিল এক্সপ্রেশন আপনাকে কেবলমাত্র সিটিইর জন্য নয় তার কলামগুলির জন্যও স্পষ্টভাবে উপকরণ নির্দিষ্ট করতে দেয় specify

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

এটি @ ডেজোর উদাহরণ থেকে পৃথক যে এটি col AS aliasপ্রতিটি SELECTতালিকার জন্য কোনও তালিকার জন্য ব্যবহার করে না ; এটি সিটিই টেবিল ওরফে কলামের নামগুলি উপকরণ দেয়।

আমি VALUESএকটি subquery হিসাবে একটি অভিব্যক্তি ব্যবহার করেছি কিন্তু আপনি 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

@ ডেজো না, এবং আমার সম্ভবত একটি মন্তব্য পোস্ট করা উচিত ছিল। দুঃখিত।
ক্রেগ রিঞ্জার

আমি মনে করি এটি ঠিক আছে। এমনকি আমি আপনার উত্তর বি / সি upvated এটি দরকারী তথ্য যা আমার না।
dezso

গতিময়ভাবে কলামের উপাধি পাওয়ার জন্য কোনও বাক্য গঠন আছে? আমি একটি EAV (সত্তা বৈশিষ্ট্য মান) স্কিমা থেকে টানছি যেখানে বৈশিষ্ট্য.নাম কলাম থেকে পছন্দসই মূল নামগুলিও নির্বাচিত হয়েছে।
ক্রিস

@ ক্রিস আপনার 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
এই উত্তরটি একটি রত্ন।
টিফন

ধন্যবাদ আপনি আমার বিকেল অনেকটা সংরক্ষণ করেছেন, খুব খারাপ এটি পোস্টগ্র্রেএসকিউএল এপিআই-এ উদ্ধৃত উদাহরণ নয়। আমি জানতাম এটি সম্ভব ছিল
জালারসি

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
;

তবে আমি আগেরটি আরও পাঠযোগ্য found

ইন WITHঅংশ মাছি কোনো কাঠামো সারি গঠন করা যেতে পারে।


জসনব দিয়ে নন-জসনবকে সংযুক্ত করার জন্য :: নির্বাচন করুন সারি_তো_জসন (আর। *) ফর্ম (সিলেক্ট সি 1, সি 2 :: জসনব ফর্ম ইউজ_সিএ_মোনটারি_আওক.স্টেস্ট) হিসাবে
অ্যান্ড্রু স্কট ইভান্স

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;
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.