PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Bagaimana cara menggunakan ANY alih-alih IN dalam klausa WHERE dengan Rails?

Ada dua varian IN ekspresi:

  • expression IN (subquery)
  • expression IN (value [, ...])

Demikian pula, dua varian dengan ANY membangun:

  • expression operator ANY (subquery)
  • expression operator ANY (array expression)

Subquery berfungsi untuk kedua teknik, tetapi untuk kedua bentuk masing-masing, IN mengharapkan daftar nilai (sebagaimana didefinisikan dalam SQL standar) while = ANY mengharapkan array .

Mana yang harus digunakan?

ANY adalah tambahan yang lebih serbaguna, dapat dikombinasikan dengan operator biner mana pun yang mengembalikan nilai boolean. IN terbakar menjadi kasus khusus ANY . Faktanya, bentuk keduanya ditulis ulang secara internal:

IN ditulis ulang dengan = ANY
NOT IN ditulis ulang dengan <> ALL

Periksa EXPLAIN output untuk permintaan apa pun untuk dilihat sendiri. Ini membuktikan dua hal:

  • IN tidak pernah bisa lebih cepat dari = ANY .
  • = ANY tidak akan jauh lebih cepat.

Pilihannya harus diputuskan oleh apa yang lebih mudah diberikan :daftar nilai atau larik (mungkin sebagai literal larik - nilai tunggal).

Jika ID yang akan Anda berikan berasal dari dalam DB lagi pula, jauh lebih efisien untuk memilihnya secara langsung (subquery) atau mengintegrasikan tabel sumber ke dalam kueri dengan JOIN (seperti komentar @mu).

Untuk melewati daftar panjang nilai dari klien Anda dan dapatkan kinerja terbaik , gunakan larik, unnest() dan gabungkan, atau berikan sebagai ekspresi tabel menggunakan VALUES (seperti komentar @PinnyM). Tetapi perhatikan bahwa JOIN mempertahankan kemungkinan duplikat dalam array / set yang disediakan saat IN atau = ANY tidak. Selengkapnya:

  • Mengoptimalkan kueri Postgres dengan IN besar

Dengan adanya nilai NULL, NOT IN seringkali pilihan yang salah dan NOT EXISTS akan benar (dan juga lebih cepat):

  • Pilih baris yang tidak ada di tabel lain

Sintaks untuk = ANY

Untuk ekspresi larik yang diterima Postgres:

  • sebuah konstruktor array (array dibangun dari daftar nilai di sisi Postgres) dari formulir:ARRAY[1,2,3]
  • atau literal array dalam bentuk '{1,2,3}' .

Untuk menghindari jenis cast yang tidak valid, Anda dapat melakukan cast secara eksplisit:

ARRAY[1,2,3]::numeric[]
'{1,2,3}'::bigint[]

Terkait:

  • PostgreSQL:Masalah dengan meneruskan array ke prosedur
  • Cara meneruskan array tipe khusus ke fungsi Postgres

Atau Anda bisa buat fungsi Postgres dengan menggunakan VARIADIC parameter, yang mengambil argumen individual dan membentuk larik darinya:

  • Meneruskan beberapa nilai dalam satu parameter

Bagaimana cara melewatkan array dari Ruby?

Dengan asumsi id menjadi integer :

MyModel.where('id = ANY(ARRAY[?]::int[])', ids.map { |i| i})

Tapi saya hanya mencoba-coba di Ruby. @mu memberikan instruksi terperinci dalam jawaban terkait ini:

  • Mengirim larik nilai ke kueri sql di ruby?



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bagaimana cara memasukkan hasil nol / 0 dalam COUNT agregat?

  2. Dapatkan id sisipan terakhir setelah sisipan yang disiapkan dengan PDO

  3. psycopg2.OperationalError:FATAL:protokol frontend tidak didukung 1234.5679:server mendukung 2.0 hingga 3.0

  4. Cara Mendapatkan Baris Pertama Per Grup di PostgreSQL

  5. Ubah karakter Unicode yang lolos kembali ke karakter sebenarnya di PostgreSQL