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

IN vs operator APAPUN di PostgreSQL

(Baik IN atau ANY adalah "operator". Sebuah "konstruksi" atau "elemen sintaks".)

Secara logis , mengutip manual:

IN setara dengan = ANY .

Tapi ada dua varian sintaks dari IN dan dua varian ANY . Detail:

  • Bagaimana cara menggunakan ANY daripada IN dalam klausa WHERE dengan Rails?

IN mengambil set setara dengan = ANY mengambil set , seperti yang ditunjukkan di sini:

  • postgreSQL - dalam vs apa pun

Namun varian kedua masing-masing tidak setara dengan yang lain. Varian kedua dari ANY konstruksi membutuhkan array (harus merupakan tipe array yang sebenarnya), sedangkan varian kedua dari IN mengambil daftar nilai yang dipisahkan koma . Hal ini menyebabkan batasan yang berbeda dalam meneruskan nilai dan dapat juga mengarah ke rencana kueri yang berbeda dalam kasus khusus:

  • Indeks tidak digunakan dengan =any() tetapi digunakan dengan in
  • Meneruskan beberapa set atau larik nilai ke suatu fungsi
  • Bagaimana cara mencocokkan elemen dalam array tipe komposit?

ANY lebih serbaguna

ANY konstruksi jauh lebih fleksibel, karena dapat dikombinasikan dengan berbagai operator, bukan hanya = . Contoh:

SELECT 'foo' LIKE ANY('{FOO,bar,%oo%}');

Untuk sejumlah besar nilai, berikan set skala lebih baik untuk masing-masing:

  • Mengoptimalkan kueri Postgres dengan IN besar

Terkait:

  • Dapatkah PostgreSQL mengindeks kolom array?

Pembalikan / kebalikan / pengecualian

"Temukan baris di mana id ada dalam larik yang diberikan":

SELECT * FROM tbl WHERE id = ANY (ARRAY[1, 2]);

Inversi:"Temukan baris di mana id adalah tidak dalam larik":

SELECT * FROM tbl WHERE id <> ALL (ARRAY[1, 2]);
SELECT * FROM tbl WHERE id <> ALL ('{1, 2}');  -- equivalent array literal
SELECT * FROM tbl WHERE NOT (id = ANY ('{1, 2}'));

Ketiganya setara. Yang pertama dengan konstruktor array, dua lainnya dengan array literal. Tipe data dapat diturunkan dari konteks dengan jelas. Jika tidak, pemeran eksplisit mungkin diperlukan, seperti '{1,2}'::int[] .

Baris dengan id IS NULL tidak lulus salah satu dari ekspresi ini. Untuk memasukkan NULL nilai tambahan:

SELECT * FROM tbl WHERE (id = ANY ('{1, 2}')) IS NOT TRUE;


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Temukan n Tetangga Terdekat untuk Titik tertentu menggunakan PostGIS?

  2. PostGIS Beraksi

  3. Perintah pengembalian baris SQL

  4. Bagaimana cara mengakses indeks internal array dengan postgreSQL?

  5. mencetak nilai variabel di postgresql