Saya punya dua meja. Pengguna tabel memiliki satu kolom category_ids sebagai larik bilangan bulat integer[] yang disimpan sebagai {1001,1002}

Saya mencoba mendapatkan semua detail kategori tetapi tidak berhasil.

SELECT * 
FROM categories 
WHERE id IN (Select category_ids from users where id=1)

Ketika saya menjalankan Select category_ids from users where id=1 saya mendapatkan hasil sebagai {1001,1002}. Bagaimana cara menjadikan {1001,1002} sebagai (1001,1002) atau apa yang harus saya ubah agar berfungsi di atas kueri?

0
Niklesh Raut 29 Desember 2020, 16:42

3 jawaban

Jawaban Terbaik

Anda dapat menggunakan =ANY():

SELECT  * 
FROM categories 
    JOIN users ON categories.id =any(category_ids)
WHERE   users.id = 1;

Tapi mengapa Anda menggunakan array?

1
Frank Heikens 29 Desember 2020, 13:50

Saya akan menggunakan kondisi EXISTS:

SELECT * 
FROM categories c
WHERE EXISTS (Select * 
              from users u
              where c.id = any(u.category_ids)
                and u.id = 1);
0
a_horse_with_no_name 29 Desember 2020, 14:03

Ini mungkin harus menjadi opsi tercepat, tetapi Anda harus MENJELASKAN ANALISIS semua jawaban untuk memastikan.

SELECT *
FROM categories c
WHERE id IN (SELECT unnest(category_ids) from users where id=1)

SELECT *
FROM categories c
JOIN (SELECT unnest(category_ids) AS id from users where id=1) AS foo
ON c.id=foo.id

Kueri pertama akan menghapus duplikat dalam array karena IN(), yang kedua tidak.

Saya tidak menguji sintaks sehingga mungkin ada kesalahan ketik. Pada dasarnya unnest() adalah fungsi yang memperluas array menjadi sekumpulan baris, yaitu mengubah array menjadi tabel yang kemudian dapat Anda gunakan untuk bergabung ke tabel lain, atau dimasukkan ke dalam klausa IN(), dll. Kebalikannya adalah array_agg() yang merupakan fungsi agregat yang mengembalikan array elemen agregat. Keduanya cukup nyaman.

Jika pengoptimal mengubah kueri =ANY() menjadi pemindaian seq dengan filter, maka unnest() akan jauh lebih cepat karena seharusnya menghapus sarang array dan menggunakan pemindaian indeks loop bersarang pada kategori.

Anda juga dapat mencoba ini:

SELECT *
FROM categories c
WHERE id =ANY(SELECT category_ids from users where id=1)
0
bobflux 29 Desember 2020, 16:31