Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

SQL pilih untuk semua catatan yang mungkin memiliki nilai tertentu

Jadi, Anda ingin melakukan pencarian teks gratis seperti Google melalui database Anda. Ini bisa dilakukan tetapi pertunjukannya adalah Teh Suck! Google cepat karena memiliki indeks pada indeksnya, penyimpanan data duplikat, dan umumnya mengoptimalkan segalanya untuk jenis penelusuran ini.

Bagaimanapun, ini adalah bukti konsep menggunakan SQL dinamis dan kamus data Oracle. Perhatikan bahwa saya membatasi kolom ke jenis data yang ingin saya cari yaitu string.

SQL> set serveroutput on size unlimited
SQL> declare
  2      dummy varchar2(1);
  3  begin
  4      for r in ( select table_name, column_name from user_tab_cols
  5                 where data_type in ('VARCHAR2', 'CHAR', 'CLOB') )
  6      loop
  7          begin
  8              execute immediate 'select null from '||r.table_name
  9                      ||' where '||r.column_name||' like ''%&search_value%'' '
 10                      ||' and rownum = 1'
 11                 into dummy;
 12              dbms_output.put_line('Found it in >>>'
 13                     ||r.table_name||'.'||r.column_name);
 14          exception
 15              when others then
 16                  -- bad practice ahoy!
 17                  null;
 18          end;
 19      end loop;
 20  end;
 21  /
Enter value for search_value: MAISIE
old   9:                ||' where '||r.column_name||' like ''%&search_value%'' '
new   9:                ||' where '||r.column_name||' like ''%MAISIE%'' '
Found it in >>>T23.NAME

PL/SQL procedure successfully completed.

SQL>

Implementasi yang lebih kuat mungkin perlu menangani kasus, seluruh kata, dll. Jika Anda menggunakan 10g atau lebih tinggi maka ekspresi reguler dapat berguna, tetapi menggabungkan regex dan SQL dinamis adalah, eh, menarik prospek.

Saya ulangi bahwa pertunjukannya adalah Teh Suck! pada kumpulan data yang besar. Hampir tidak mungkin untuk menyetel, karena kami tidak dapat mengindeks setiap kolom, dan tentu saja tidak mendukung LIKE atau pencocokan fuzzy serupa. Pendekatan alternatif adalah menggunakan XQuery untuk menghasilkan representasi XML dari data Anda dan kemudian menggunakan Teks untuk mengindeksnya. Mempertahankan repositori seperti itu akan menjadi beban, tetapi upaya tersebut akan menjadi investasi yang baik jika Anda membutuhkan fungsionalitas ini secara teratur, terutama di lingkungan produksi.

Kami dapat melakukan pencarian yang lebih luas di semua tabel yang kami miliki hak istimewanya dengan menggunakan all_tab_cols alih-alih.

for r in ( select owner, table_name, column_name from all_tab_cols
                   where data_type in ('VARCHAR2', 'CHAR', 'CLOB') )

Jelas kita perlu awalan skema kepemilikan dalam pernyataan yang dihasilkan.

execute immediate 'select null from '||r.owner||'.'||r.table_name
                       ||' where '||r.column_name||' like ''%


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Oracle PL/SQL:mengurutkan baris

  2. Penyamaran data Oracle

  3. koneksi jdbc menggunakan driver tipis

  4. java mengembalikan nilai String kosong untuk Oracle VARCHAR2

  5. Cari Kolom XML di SQL