PostgreSQL: Kombinasi Query LIKE dan IN

Saya memiliki dua tabel, misalkan tabel users (berisi name) dan tabel badwords (berisi word). Kebutuhannya adalah:

  1. Menemukan semua user yang namanya mengandung salah satu (atau lebih) kata yang terdapat di tabel badwords.
  2. Menemukan semua user yang namanya tidak mengandung satupun kata yang terdapat di tabel badwords.

Asumsikan semua name dan word ditulis dengan lowercase. Jika tidak, dapat menggunakan ILIKE.

Untuk masalah pertama:
SELECT *
FROM users
WHERE users.name LIKE ANY (
SELECT '%' || badwords.word || '%'
FROM badwords
)

Untuk masalah kedua:
SELECT *
FROM users
WHERE users.name NOT LIKE ALL (
SELECT '%' || badwords.word || '%'
FROM badwords
)

Penjelasan singkat:
Kita tidak dapat menggunakan IN karena IN bersifat membandingkan secara utuh, sementara kita butuh pembanding yang dapat membandingkan secara parsial (LIKE/ILIKE). Penggunaan ANY seperti OR, jika satu saja atau lebih dari subquery memenuhi kondisi LIKE, maka kondisi WHERE terpenuhi. Sementara penggunaan ALL seperti AND, harus semua terpenuhi (di kasus ini karena menggunakan NOT, berarti semua kata di subquery harus tidak ada).