Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Mengganti nama kolom kolom tabel sesuai dengan pemetaan yang ditentukan dalam tabel lain - dengan MYSQL

Saya rasa saya mengerti Anda ingin memilih kolom berdasarkan nama, dan nama-nama tersebut adalah string di TABLE_MASTER Anda.

Anda tidak dapat melakukan ini dalam satu kueri SQL, karena SQL tidak dapat memilih kolom dengan menggunakan ekspresi string. Ada perbedaan antara string dan pengenal. Misalnya, ini memilih data dari kolom dengan pengenal:

SELECT header01 ...

Tapi berikut ini adalah ekspresi string (yang sederhana, yang hanya merupakan nilai konstan). Ini hanya mengembalikan string tetap 'header01', BUKAN data dari kolom nama itu:

SELECT 'header01' ...

Demikian juga, menggunakan ekspresi lain dalam daftar pilih hanya memilih nilai ekspresi itu, BUKAN data yang disimpan dalam kolom yang dinamai dengan nilai string ekspresi.

Oleh karena itu jika Anda ingin kueri mengembalikan kolom dinamis yang dinamai oleh beberapa variabel atau ekspresi lain, Anda tidak bisa melakukannya dalam kueri yang sama tempat Anda membaca ekspresi itu. Anda harus memformat kueri SQL baru dari nilai yang Anda baca. Ini disebut pernyataan SQL dinamis (sudah disebutkan oleh spencer7593, yang memposting jawaban saat saya menulis jawaban saya sendiri).

Anda dapat menggunakan TABLE_MASTER untuk memformat pernyataan SQL dinamis untuk mengambil kolom dan mendefinisikan ulang aliasnya:

SELECT CONCAT(
  'SELECT ', 
   GROUP_CONCAT(CONCAT(ORIGIN, ' AS ', TARGET)), ', ', 
   QUOTE(MAX(NAME)), ' AS NAME ',
  'FROM TABLE_EXAMPLE'
) INTO @sql
FROM TABLE_MASTER;

Hasil dari ini adalah string yang membentuk pernyataan SELECT lain, yang ini mengganti nama kolom seperti yang Anda inginkan:

SELECT header01 AS header_master01,header02 AS header_master02, 'Paul' AS NAME FROM TABLE_EXAMPLE  

Kemudian Anda dapat menggunakan string yang disimpan di @sql sebagai kueri SQL dinamis.

Berikut prosedur yang melakukan ini:

DELIMITER ;;

CREATE PROCEDURE MyProc()
BEGIN
    SELECT CONCAT(
      'SELECT ', 
       GROUP_CONCAT(CONCAT(ORIGIN, ' AS ', TARGET)), ', ', 
       QUOTE(MAX(NAME)), ' AS NAME ',
      'FROM TABLE_EXAMPLE'
    ) INTO @sql
    FROM TABLE_MASTER;
    PREPARE stmt FROM @sql;
    EXECUTE stmt;
    DEALLOCATE PREPARE stmt;
END

DELIMITER ;

Panggil prosedurnya, dan dapatkan hasilnya:

CALL MyProc();

+-----------------+-----------------+------+
| header_master01 | header_master02 | NAME |
+-----------------+-----------------+------+
| data01          | data02          | Paul |
| data11          | data12          | Paul |
+-----------------+-----------------+------+

Saya harus berkomentar bahwa ini adalah banyak masalah yang harus dilalui. Saya lebih suka mengambil data seperti yang ada di database, dan memformat ulang dalam kode aplikasi saya. Kemudian saya tidak perlu menggunakan SQL dinamis untuk memformat kolom.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Gunakan Database Relasional MySQL di Ubuntu 8.04 (Hardy)

  2. Fungsi String MySQL (Daftar Lengkap)

  3. masukkan nilai tanpa menyetel kunci utama

  4. Periksa apakah string berisi angka

  5. Catat setiap kueri MySQL ke file dengan mengaktifkan General Log in MAMP