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

Permintaan pemilihan MySQL dengan nama kolom variabel

Solusi paling sederhana adalah dengan menggunakan dua kueri terpisah.

Kami menggunakan hasil dari kueri pertama untuk menghasilkan teks SQL secara dinamis untuk kueri kedua.

mysql> SET @colname := '' ; 
mysql> SELECT t.rslt FROM table1 t WHERE t.id = 1 ORDER BY t.rslt LIMIT 1 INTO @colname ;

mysql> SET @sql := CONCAT('SELECT `',@colname,'` FROM table2 ORDER BY 1') ;
mysql> PREPARE stmt FROM @sql ; 
mysql> EXECUTE stmt ;

mysql> DEALLOCATE PREPARE stmt ;

N.B. termasuk @colname sebagai bagian dari teks SQL, SQL yang disiapkan secara dinamis, berpotensi menjadi kerentanan SQL Injection.

Jika persyaratannya adalah menyelesaikan sesuatu yang serupa dalam konteks tunggal Pernyataan SQL, maka pernyataan tersebut perlu mengantisipasi kemungkinan nilai yang akan dikembalikan untuk kueri dari tabel1, dan menyertakan referensi eksplisit ke kolom yang mungkin dari tabel2. Misalnya, seperti ini:

  SELECT CASE ( SELECT t.rslt FROM table1 t WHERE t.id = 1 LIMIT 1 )
           WHEN 'r1' THEN r.r1 
           WHEN 'r2' THEN r.r2 
           WHEN 'r3' THEN r.r3 
           ELSE NULL
         END AS c2
    FROM table2 r
   ORDER BY ...

Ini belum tentu cara yang paling efisien untuk menulis kueri, tetapi ini menunjukkan polanya.

Dalam pernyataan SQL, pengidentifikasi (nama tabel, nama kolom, nama fungsi) harus ditentukan secara eksplisit; ini tidak dapat diturunkan secara dinamis pada saat run time. Ini karena bagaimana pernyataan SQL diproses... menguraikan teks SQL untuk sintaks, lalu menguraikan semantik (referensi dan hak istimewa yang valid), mengevaluasi biaya relatif untuk jalur akses yang tersedia, memilih rencana eksekusi, dan kemudian mengeksekusi rencana itu.

Artinya, perilaku yang diamati dengan SQL ini adalah apa yang kita harapkan:

 SELECT (SELECT rslt FROM table1 WHERE id = 1) FROM table2

Teks SQL disiapkan, dan pada waktu eksekusi, untuk setiap baris dalam tabel2, subquery di SELECT daftar dijalankan. Jika subquery mengembalikan nilai skalar, nilai skalar dikembalikan sebagai kolom kueri luar. Nilai yang dikembalikan oleh subkueri adalah nilai , itu tidak (dan tidak dapat) dievaluasi sebagai nama 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. Apa perbedaan antara gabungan yang dipisahkan koma dan bergabung pada sintaks di MySQL?

  2. MySql - Apakah kunci utama unik secara default?

  3. Bagaimana saya bisa mendapatkan kueri untuk .save() di Django?

  4. Menyimpan kata sandi untuk MYSQL dalam aplikasi PHP dengan cara yang aman

  5. MySQL:tanggal sebelum 1970