SQL选择可能包含特定值的所有记录

ser*_*nni 2 sql oracle search select metadata

如何选择可能包含已知特定值的所有记录,而不引用 SQL表达式中的特定列

例如,我知道,一些未知列保存值'xxx',表中有许多列和记录.

谢谢.

APC*_*APC 9


因此,您希望对数据库执行类似Google的自由文本搜索.这可以做到,但性能将是Teh Suck!谷歌很快,因为它的索引上有索引,有重复的数据存储,并且通常会优化所有这些搜索.

无论如何,这是使用动态SQL和Oracle数据字典的概念证明.请注意,我将列限制为我要搜索的数据类型,即字符串.

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>
Run Code Online (Sandbox Code Playgroud)

更强大的实现可能需要处理大小写,整个单词等.如果你是10g或更高,那么正则表达式可能是有用的,但结合正则表达式和动态SQL是一个 有趣的前景.

我再说一遍,表演将是Teh Suck!在大型数据集上.调整几乎是不可能的,因为我们不能索引每一列,当然也不支持LIKE或类似的模糊匹配.另一种方法是使用XQuery生成数据的XML表示,然后使用Text对其进行索引.维护这样的存储库将是开销,但如果您需要定期的这种功能,特别是在生产环境中,这项工作将是一项合理的投资.


我们可以通过使用我们拥有权限的所有表格进行更广泛的搜索all_tab_cols.

for r in ( select owner, table_name, column_name from all_tab_cols
                   where data_type in ('VARCHAR2', 'CHAR', 'CLOB') )
Run Code Online (Sandbox Code Playgroud)

显然,我们需要在生成的语句中为拥有的模式添加前缀.

execute immediate 'select null from '||r.owner||'.'||r.table_name
                       ||' where '||r.column_name||' like ''%
Run Code Online (Sandbox Code Playgroud)