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

Mencocokkan pola antara beberapa kolom

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 .



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Membuat dump Postgres dan menyimpan ke server lain

  2. koneksi lokal docker postgres pgadmin

  3. FATAL:tidak dapat mengakses file kunci pribadi /etc/ssl/private/ssl-cert-snakeoil.key:Izin ditolak

  4. Postgres pg_try_advisory_lock memblokir semua catatan

  5. masalah npgsql di aplikasi c # - Koneksi yang ada ditutup secara paksa oleh host jarak jauh