Dalam SQL, menukar jadual melibatkan penukaran jadual berorientasikan baris kepada berorientasikan lajur. Ini boleh berguna untuk pelbagai senario, seperti membuat laporan ringkasan pengguna.
Satu pendekatan untuk mencapai transposisi dalam SQL ialah menggunakan pernyataan CASE. Pertimbangkan jadual dengan lajur: Id, UserId, FieldName dan FieldValue, seperti yang ditunjukkan dalam contoh yang disediakan.
SELECT t.userid, MAX(CASE WHEN t.fieldname = 'Username' THEN t.fieldvalue ELSE NULL END) AS Username, MAX(CASE WHEN t.fieldname = 'Password' THEN t.fieldvalue ELSE NULL END) AS Password, MAX(CASE WHEN t.fieldname = 'Email Address' THEN t.fieldvalue ELSE NULL END) AS Email FROM t GROUP BY t.userid
Pertanyaan ini akan mengembalikan hasil transposed, mengumpulkan pengguna mengikut UserId dan memberikan nilai medan yang sepadan kepada lajur Nama Pengguna, Kata Laluan dan Alamat E-mel.
Walau bagaimanapun, pendekatan ini memerlukan penentuan penyata CASE untuk setiap bidang, yang boleh membosankan dan tidak fleksibel. Untuk menjadikan ini dinamik, anda boleh menggunakan sintaks MySQL's Prepared Statement (dynamic SQL).
SET @sql = CONCAT("SELECT userid"); -- Dynamically create the field selection part SET @field_list = ( SELECT GROUP_CONCAT( CONCAT('MAX(CASE WHEN t.fieldname = ''', fieldname, ''' THEN t.fieldvalue ELSE NULL END) AS ', fieldname) ) FROM t GROUP BY userid ); SET @sql = CONCAT(@sql, ", ", @field_list); SET @sql = CONCAT(@sql, " FROM t GROUP BY userid"); PREPARE stmt FROM @sql; EXECUTE stmt;
Pertanyaan ini membina pernyataan SQL dinamik menggunakan hasil subkueri untuk menentukan bahagian pemilihan medan. Ia menggunakan fungsi GROUP_CONCAT untuk menggabungkan penyataan CASE, memastikan bahawa pertanyaan SQL yang dibina secara dinamik adalah sah.
Dengan menggunakan SQL dinamik, anda boleh mengelak daripada mentakrifkan pernyataan CASE secara manual dan mengekalkan fleksibiliti, membenarkan pertanyaan anda mengendalikan sebarang nombor daripada medan yang ditentukan pengguna.
Atas ialah kandungan terperinci Bagaimana untuk Mengubah Jadual Secara Dinamik dalam SQL Menggunakan Pernyataan yang Disediakan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!