Saya telah membaca tentang objek JSON dan tipe objek JSON. Saya hanya ingin melakukan select dan mengembalikan JSON. Saya tidak perlu menyimpan objek JSON. Serialisasi sendiri bukan pertanyaan saya. Kolom-kolomnya adalah kolom Varchar, Int, dll, tidak ada objek JSON, "normal &" baris database.
Dapatkah saya melakukan SELECT lama biasa dan mengembalikan JSON untuk MySQL?
Bukankah ini yang dilakukan FOR JSON di SQL SERVER dan rows_for_json di PostgreSQL?
Mereka tampak lebih maju dalam hal ini tetapi saya tidak ingin membodohi diri sendiri.
Saya menemukan pertanyaan ini dari tahun 2016: https://stackoverflow.com/questions/35324795/mysql-5-7-return-row-as-json-using-new-json-features
Tidak terdengar bagi saya bahwa Anda ingin mengagregasi JSON. Anda menyatakan bahwa Anda ingin setara dengan row_to_json
, jika demikian maka saya sarankan untuk memeriksa [JSON_OBJECT
] yang jauh lebih sederhana (https://dev.mysql.com/doc/refman/5.7/en/json-creation-functions.html)
SELECT JSON_OBJECT(
'name_field', name_field,
'address_field', address_field,
'contact_age', contact_age
)
FROM contact;
Sebagai catatan tambahan, jika Anda perlu mengagregasi sebuah resultset ke json. maka MySQL 8 yang akan datang akan melakukannya untuk Anda.
JSON_ARRAYAGG()
Mengembalikan set hasil sebagai array JSON tunggalJSON_OBJECTAGG()
` Mengembalikan kumpulan hasil sebagai objek JSON tunggalButuh sedikit mencari tahu (lebih terbiasa dengan PostgreSQL di mana semuanya jauh lebih mudah!), tetapi jika Anda berkonsultasi dengan manual yang bagus di sini, di bawah 12.16.2 Fungsi yang Membuat Nilai JSON
, ada fungsi JSON_ARRAY
, tetapi itu tidak banyak digunakan - setidaknya dalam kasus ini!
Untuk menjawab pertanyaan "select and it return JSON"
, ada dua cara untuk melakukan ini, keduanya agak menyakitkan!
Anda bisa
menggunakan "hack" - lihat db-fiddle di sini,
atau menggunakan salah satu fungsi JSON baru yang disediakan MySQL di sini - yang, ironisnya, tampaknya lebih merupakan peretasan daripada peretasan itu sendiri! Hanya dengan MySQL! :-) (biola di sini).
Kedua jawaban tersebut menggunakan fungsi GROUP_CONCAT
MySQL - posting ini membantu. Anda mungkin ingin mengatur variabel sistem group_concat_max_len ke sedikit lebih banyak dari defaultnya (1024 yang remeh)!
Query pertama, seperti yang anda bayangkan, berantakan (DDL
dan DML
di bagian bawah jawaban ini):
SELECT CONCAT('[', better_result, ']') AS best_result FROM
(
SELECT GROUP_CONCAT('{', my_json, '}' SEPARATOR ',') AS better_result FROM
(
SELECT
CONCAT
(
'"name_field":' , '"', name_field , '"', ','
'"address_field":', '"', address_field, '"', ','
'"contact_age":' , contact_age
) AS my_json
FROM contact
) AS more_json
) AS yet_more_json;
Hasil:
[{"name_field":"Mary","address_field":"address one","contact_age":25},{"name_field":"Fred","address_field":"address two","contact_age":35},{"name_field":"Bill","address_field":"address three","contact_age":47}]
yang benar, tetapi, mari kita hadapi itu, sedikit mimpi buruk!
Lalu ada pendekatan MySQL JSON_ARRAY()
(yang bahkan lebih berantakan - terima kasih MySQL untuk implementasi (yang tidak ada) fungsi TRANSLATE()
Anda!)
SELECT
CONCAT
('[', REPLACE
(
REPLACE
(
GROUP_CONCAT
(
JSON_ARRAY
(
'name_field:', name_field,
'address_field:', address_field,
'age_field:', contact_age
) SEPARATOR ','
), '[', '{'
), ']', '}'
), ']'
)
AS best_result2
FROM contact
Hasil yang sama!
==== TABLE CREATION and INSERT DDL and DML ============
CREATE TABLE contact
(
name_field VARCHAR (5) NOT NULL,
address_field VARCHAR (20) NOT NULL,
contact_age INTEGER NOT NULL
);
INSERT INTO contact
VALUES
('Mary', 'address one', 25),
('Fred', 'address two', 35),
('Bill', 'address three', 47);
Ini akan memberi Anda jawaban yang sama, tetapi kode yang jauh lebih mudah. Saya hanya menggunakan json_object
dengan group_concat
untuk menyederhanakan jawaban lain.
pilih
concat('[',
GROUP_CONCAT(
JSON_OBJECT(
'nama_bidang', nama_bidang
,'bidang_alamat', bidang_alamat
,'contact_age', contact_age
)
PEMISAH ',')
,']')
dari kontak;