Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

MySQL select query với tên cột biến

Giải pháp đơn giản nhất là sử dụng hai truy vấn riêng biệt.

Chúng tôi sử dụng kết quả từ truy vấn đầu tiên để tạo động văn bản SQL cho truy vấn thứ hai.

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. bao gồm @colname là một phần của văn bản SQL, SQL được chuẩn bị động, là một lỗ hổng SQL Injection tiềm ẩn.

Nếu yêu cầu là hoàn thành một việc gì đó tương tự trong ngữ cảnh của một đơn vị Câu lệnh SQL, thì câu lệnh cần dự đoán các giá trị có thể được trả về cho truy vấn từ table1 và bao gồm các tham chiếu rõ ràng đến các cột có thể có từ table2. Ví dụ:một cái gì đó như thế này:

  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 ...

Đây không nhất thiết là cách hiệu quả nhất để viết truy vấn, nhưng nó thể hiện mẫu.

Trong một câu lệnh SQL, các định danh (tên bảng, tên cột, tên hàm) phải được chỉ định rõ ràng; chúng không thể được dẫn xuất động tại thời gian chạy. Điều này là do cách các câu lệnh SQL được xử lý ... phân tích cú pháp văn bản SQL, sau đó phân tích ngữ nghĩa (tham chiếu hợp lệ và đặc quyền), đánh giá chi phí tương đối cho các đường dẫn truy cập có sẵn, chọn một kế hoạch thực thi và sau đó thực hiện kế hoạch đó.

Đó là, hành vi được quan sát với SQL này là những gì chúng tôi mong đợi:

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

Văn bản SQL được chuẩn bị và tại thời điểm thực thi, đối với mỗi hàng trong bảng2, truy vấn con trong SELECT danh sách được thực thi. Nếu truy vấn con trả về giá trị vô hướng, thì giá trị vô hướng được trả về dưới dạng một cột của truy vấn bên ngoài. Giá trị được trả về bởi truy vấn con là giá trị , nó không (và không thể được) đánh giá như một tên cột.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cách nhỏ gọn nhất để lưu trữ các khác biệt trong cơ sở dữ liệu là gì?

  2. Kết quả truy vấn MySql tất cả các giờ trong ngày

  3. mysql_query tới PDO và các câu lệnh chuẩn bị

  4. Cách truy xuất tất cả các bản ghi bằng khóa ngoại với Laravel

  5. Làm thế nào để thay đổi giá trị cột trong MySQL?