栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

SQL为可能具有特定值的所有记录选择

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

SQL为可能具有特定值的所有记录选择


因此,您想对数据库进行类似于Google的免费文本搜索。可以做到,但表演将是Teh
Suck!Google之所以快速,是因为它在其索引上具有索引,重复的数据存储,并且通常针对这种搜索进行总体优化。

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

SQL> set serveroutput on size unlimitedSQL> 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: MAISIEold   9:     ||' where '||r.column_name||' like ''%&search_value%'' 'new   9:     ||' where '||r.column_name||' like ''%MAISIE%'' 'Found it in >>>T23.NAMEPL/SQL procedure successfully completed.SQL>

一个更健壮的实现可能需要处理大小写,整个单词等。如果您使用的是10g或更高版本,则正则表达式可能会有用,但是将regex和动态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') )

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

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


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/379247.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号