sql >> Databáze >  >> RDS >> Oracle

SQL select pro všechny záznamy, které mohou mít určitou hodnotu

Chcete tedy ve své databázi provádět bezplatné textové vyhledávání podobné Googlu. To lze udělat, ale výkon bude Teh Suck! Google je rychlý, protože má na svých indexech indexy, duplicitní úložiště dat a obecně vše optimalizuje přesně pro tento druh vyhledávání.

Každopádně zde je důkaz konceptu pomocí dynamického SQL a datového slovníku Oracle. Všimněte si, že sloupce omezuji na typ dat, která chci hledat, tj. řetězce.

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>

Robustnější implementace může vyžadovat zpracování velkých a malých písmen, celých slov atd. Pokud používáte 10g nebo vyšší, mohou být užitečné regulární výrazy, ale kombinace regulárního výrazu a dynamického SQL je, ehm, zajímavé vyhlídka.

Opakuji, že představení bude Teh Suck! na velkém souboru dat. Je prakticky nemožné vyladit, protože nemůžeme indexovat každý sloupec a už vůbec ne podporovat LIKE nebo podobné fuzzy shody. Alternativním přístupem by bylo použití XQuery k vygenerování reprezentace vašich dat ve formátu XML a poté k jejich indexování použít Text. Údržba takového úložiště by byla režijní, ale vynaložené úsilí by bylo rozumnou investicí, pokud tuto funkci potřebujete pravidelně, zejména v produkčním prostředí.

Pomocí all_tab_cols můžeme provádět širší vyhledávání ve všech tabulkách, ke kterým máme oprávnění namísto.

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

Je zřejmé, že ve vygenerovaném příkazu potřebujeme předponu vlastnícího schématu.

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


  1. Jaký je význam předkompilovaných uložených procedur?

  2. Funkce Postgres vrací tabulku, která nevrací data ve sloupcích

  3. Escapování speciálních znaků v to_tsquery

  4. Django views.py Verze SQL Join s Multi Table Query