kzen.dev
  • Pertanyaan
  • Tag
  • Pengguna
Notifikasi
Imbalan
Registrasi
Setelah Anda mendaftar, Anda akan diberitahu tentang balasan dan komentar untuk pertanyaan Anda.
Gabung
Jika Anda sudah memiliki akun, masuk untuk memeriksa pemberitahuan baru.
Akan ada hadiah untuk pertanyaan, jawaban, dan komentar tambahan.
Lebih
Sumber
Sunting
Pengguna anonim
Question

SQL: Memilih kolom berdasarkan nilai kolom dari tabel lain

Saya memiliki tabel berikut ini:

UserPrivileges: 
+--------+------+------+------+
| UserID | Col1 | Col2 | Col3 |
+--------+------+------+------+
|      1 |    0 |    1 |    1 |
|      2 |    0 |    0 |    1 |
|      3 |    1 |    0 |    0 |
|      4 |    1 |    1 |    0 |
+--------+------+------+------+

Data:
+--------+------+------+------+
| DataID | Col1 | Col2 | Col3 |
+--------+------+------+------+
|      1 | A    | B    | C    |
|      2 | D    | E    | F    |
|      3 | G    | H    | I    |
|      4 | J    | K    | L    |
+--------+------+------+------+

Pertanyaan saya pada bentuknya yang paling sederhana tidak ada hubungannya dengan tabel Data tetapi saya hanya menjelaskannya sehingga saya mungkin melakukannya dengan cara yang salah.

Bagaimana saya memilih nama kolom dari UserPrivileges berdasarkan nilainya? Sehingga saya dapat menggunakan hasilnya di query lain untuk memilih hanya kolom-kolom tersebut.

Sesuatu di sepanjang garis ini:

SELECT (COLUMNS_NAME_QUERY_FROM_UserPrivileges(UserID='#')) WHERE DataID = '#' FROM Data

Atau saya tidak keberatan dengan cara yang lebih baik untuk mengelola Hak Istimewa pengguna untuk kolom tertentu.

6 2011-12-30T05:09:20+00:00 2
Pemrograman
sql
database
mysql
Elroy Flynn
Elroy Flynn
30 Desember 2011 в 5:29
2011-12-30T05:29:01+00:00
Lebih
Sumber
Sunting
#15076135

Jawabannya tergantung pada persyaratan Anda untuk hasilnya. Apakah Anda memerlukan hasil dengan sekumpulan kolom yang konsisten, terlepas dari privs pengguna? Jika demikian, Anda bisa menetapkan nilai yang tidak diperbolehkan menjadi 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 itu adalah kolom terlarang, maka Anda tidak dapat menggunakan null.

Pendekatan lain akan membuat Anda dengan sederhana memasukkan indikator hak istimewa untuk setiap kolom yang muncul dalam hasil, dan biarkan logika bisnis Anda menggunakannya untuk menentukan nilai mana yang terlihat oleh pengguna.

Pendekatan yang sangat berbeda akan membuat hasil yang ditetapkan hanya berisi kolom-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

"execute" artinya apa pun yang Anda miliki untuk mengeksekusi string sebagai perintah sql.


lebih lanjut setelah klarifikasi oleh OP:

Ok, Anda membutuhkan fungsi sql yang mengembalikan string yang terlihat seperti "colname1, colname2, ...". Berikut ini menyerupai apa yang akan terlihat seperti di sql server. sintaksis

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
Martin Schmelzer
Martin Schmelzer
Jawaban edit 31 Juli 2019 в 12:50
7
0
Uday Sawant
Uday Sawant
30 Desember 2011 в 5:50
2011-12-30T05:50:01+00:00
Lebih
Sumber
Sunting
#15076136

belum mencobanya, tetapi sesuatu seperti ini seharusnya berhasil

SELECT (SHOW COLUMNS FROM table WHERE expr) FROM data WHERE DataID = '#'

Periksa postingan ini untuk detailnya - https://stackoverflow.com/questions/452464/how-can-i-get-column-names-from-a-table

Beri tahu kami bagaimana Anda menyelesaikan ini ...

 Community
Community
Jawaban edit 23 Mei 2017 в 10:32
0
0
Related communities 1
MySQL & MariaDB Indonesia
MySQL & MariaDB Indonesia
7 724 pengguna
Group belajar, diskusi, dan berbagi tentang DBMS MySQL dan MariaDB. Disclaimer: This group is not in any affiliation nor maintained by Oracle or www.mysql.com.
Buka telegram
Tambahkan pertanyaan
Kategori
Semua
Teknologi
Budaya / Rekreasi
Kehidupan / Seni
Ilmu Pengetahuan
Profesional
Bisnis
Pengguna
Semua
Baru
Populer
1
工藤 芳則
Terdaftar 6 hari yang lalu
2
Ирина Беляева
Terdaftar 1 minggu yang lalu
3
Darya Arsenyeva
Terdaftar 1 minggu yang lalu
4
anyta nuam-nuam (LapuSiK)
Terdaftar 1 minggu yang lalu
5
Shuhratjon Imomkulov
Terdaftar 1 minggu yang lalu
ID
JA
© kzen.dev 2023
Sumber
stackoverflow.com
di bawah lisensi cc by-sa 3.0 dengan atribusi