Penting juga untuk dipahami bahwa ANY
adalah bukan seorang operator tetapi konstruksi SQL yang hanya dapat digunakan di kanan dari seorang operator. Selengkapnya:
- Bagaimana cara menggunakan ANY daripada IN dalam klausa WHERE dengan Rails?
LIKE
operator - atau lebih tepatnya:ekspresi , yang ditulis ulang dengan ~~
operator di Postgres secara internal - mengharapkan nilai ke kiri dan pola ke kanan. Tidak ada COMMUTATOR
untuk operator ini (seperti ada untuk operator persamaan sederhana =
) sehingga Postgres tidak dapat membalik operan.
Upaya Anda:
select * from someTable where '%someInput%' LIKE ANY(someColum);
telah membalik operan kiri dan kanan jadi '%someInput%'
adalah nilai dan elemen kolom larik someColum
dianggap sebagai pola (yang bukan yang Anda inginkan).
Itu akan harus ANY(someColum) LIKE '%someInput%'
- kecuali itu tidak mungkin dengan ANY
konstruksi yang hanya diperbolehkan ke kanan dari seorang operator. Anda menabrak penghalang jalan di sini.
Terkait:
- Apakah ada cara untuk mengindeks kolom teks yang berisi pola ekspresi reguler?
- Dapatkah PostgreSQL mengindeks kolom array?
Anda dapat menormalkan desain relasional dan menyimpan elemen dari array di baris terpisah dalam tabel terpisah. Kecuali itu, unnest()
adalah solusinya, seperti yang sudah Anda temukan sendiri. Tetapi sementara Anda hanya tertarik pada keberadaan setidaknya satu elemen yang cocok, sebuah EXISTS
subquery akan paling efisien sambil menghindari duplikat dalam hasil - Postgres dapat menghentikan pencarian segera setelah kecocokan pertama ditemukan:
SELECT *
FROM tbl
WHERE EXISTS (
SELECT -- can be empty
FROM unnest(someColum) elem
WHERE elem LIKE '%someInput%'
);
Anda mungkin ingin keluar dari karakter khusus di someInput
. Lihat:
- Fungsi Escape untuk ekspresi reguler atau pola LIKE
Hati-hati dengan negasi (NOT LIKE ALL (...)
) ketika NULL
dapat terlibat:
- Periksa apakah NULL ada di array Postgres