Jawaban sejauh ini gagal menjawab pertanyaan Anda:
Hampir tidak ada bedanya apakah Anda menggunakan LIKE
atau =
selama Anda mencocokkan seluruh string (dan tidak ada karakter wildcard di tali Anda). Untuk membuat pencarian menjadi kabur, Anda perlu mengganti bagian dari pola, bukan hanya menambahkannya.
Misalnya, untuk mencocokkan 7 (bukan 8) karakter terakhir dari subcolumn
:
SELECT *
FROM maintable m
WHERE left(maincolumn, 8) LIKE
( '%' || left((SELECT subcolumn FROM subtable WHERE subid = 2), 7));
Saya menggunakan left()
yang lebih sederhana (diperkenalkan dengan Postgres 9.1).
Anda could
sederhanakan menjadi:
SELECT *
FROM maintable m
WHERE left(maincolumn, 7) =
(SELECT left(subcolumn,7) FROM subtable WHERE subid = 2);
Tetapi Anda tidak akan melakukannya jika Anda menggunakan indeks khusus yang saya sebutkan lebih jauh, karena ekspresi dalam indeks fungsional harus dicocokkan dengan tepat agar dapat digunakan.
Anda mungkin tertarik dengan ekstensi pg_tgrm
.
Di PostgreSQL 9.1 jalankan sekali per database:
CREATE EXTENSION pg_tgrm;
Dua alasan:
-
Ini memasok operator kesamaan
%
. Dengannya Anda dapat membangun pencarian kesamaan yang cerdas:--SELECT show_limit(); SELECT set_limit(0.5); -- adjust similarity limit for % operator SELECT * FROM maintable m WHERE left(maincolumn, 8) % (SELECT subcolumn FROM subtable WHERE subid = 2);
-
Ini memasok dukungan indeks untuk keduanya
LIKE
dan%
Jika kinerja membaca lebih penting daripada kinerja menulis, saya sarankan Anda membuat fungsional Indeks GIN atau GiST seperti ini:
CREATE INDEX maintable_maincol_tgrm_idx ON maintable USING gist (left(maincolumn, 8) gist_trgm_ops);
Indeks ini mendukung salah satu kueri. Ketahuilah bahwa ini memerlukan beberapa biaya untuk operasi penulisan.
Tolok ukur cepat untuk kasus serupa dalam jawaban terkait ini .