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

SQL:Memilih kolom berdasarkan nilai kolom dari tabel lain

Jawabannya tergantung pada kebutuhan Anda untuk hasilnya. Apakah Anda memerlukan hasil dengan kumpulan kolom yang konsisten, terlepas dari privasi pengguna? Jika demikian, Anda dapat menyetel nilai yang tidak diizinkan ke null (atau nilai khusus lainnya) menggunakan klausa IF, mis.,

SELECT IF (p.col1 = 0 THEN NULL ELSE d.col1) AS col1, 
       IF (p.col2 = 0 THEN NULL ELSE d.col2) AS col2,
       IF (p.col3 = 0 THEN NULL ELSE d.col3) AS col3
FROM Data d, 
     UserPrivileges p
WHERE p.userId = '#' 
  AND d.DataId = '#'

Tentu saja, "nilai khusus" bisa menjadi masalah, karena Anda memerlukan nilai yang tidak akan pernah muncul dalam data. Jika Anda perlu mengetahui perbedaan antara null karena nilai sebenarnya adalah null vs. null karena merupakan kolom terlarang maka Anda tidak dapat menggunakan null.

Pendekatan lain akan meminta Anda menyertakan indikator hak istimewa untuk setiap kolom yang muncul di hasil, dan biarkan logika bisnis Anda menggunakannya untuk menentukan nilai mana yang terlihat oleh pengguna.

Pendekatan yang sangat berbeda akan membuat hasil ditetapkan hanya berisi kolom yang diizinkan. Dalam hal ini Anda harus membuat pernyataan sql Anda secara dinamis. Saya tidak tahu apakah Anda melakukan ini dalam prosedur tersimpan atau dalam bahasa host, tetapi ide dasarnya adalah seperti ini:

string sqlCmd = "SELECT " 
    + (SELECT (FIELDS_NAME_QUERY(UserID='#') 
       FROM USER_PRIVILEGES 
       WHERE userid='#') 
    + FROM data d 
execute sqlCmd

"eksekusi" yang berarti apa pun yang Anda miliki untuk mengeksekusi string sebagai perintah sql.

lebih lanjut setelah klarifikasi oleh OP:

Oke, Anda memerlukan fungsi sql yang mengembalikan string yang terlihat seperti "colname1, colname2, ...". Berikut ini menyerupai apa yang akan terlihat seperti di sql server. sintaks

create function   
FIELDS_NAME_QUERY (@userid int)  
begin  
select col1, col2, col3... INTO @col1priv, @col2priv, @col3priv FROM userPrivileges WHERE UserId = @UserId  
declare @result varhcar(60)  
set @result = ''  
if (@col1priv = 1) @result = 'col1'  
if (@col2priv = 1) @result = @result + ' ,col2'  
if (@col3priv = 1) @result = @result + ' ,col3'  
return @result  
end


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cara tercepat untuk memuat data numerik ke dalam array python/pandas/numpy dari MySQL

  2. Hapus Ajax tidak berfungsi di laravel 5.2

  3. MemoryError menggunakan json.dumps()

  4. Setel zona waktu basis data MySQL ke GMT

  5. MySQL 8.0 Metode otentikasi yang diminta tidak diketahui oleh klien (caching_sha2_password)