在特定表中查找字符串

时间:2015-04-25 17:04:09

标签: java sql oracle oracle11g

我正在使用oracle数据库,我想知道是否有办法找到任何列中包含值的所有行。例如,让我们考虑一下这个表:

               Weather

city          state        high    low

Phoenix       Arizona      105     90

Tucson        Arizona      101     92

Flagstaff     Arizona      88      69

San Diego     California   77      60

Albuquerque   New Mexico   80      72

基本上(我知道它不可能),但我想做这样的事情:

Select * From Weather Where * LIKE '%f%'

它会给我行

Flagstaff     Arizona      88      69
San Diego     California   77      60

我可以在Java端执行此操作,通过查询所有行,然后使用ResultSet动态搜索列中的给定值并添加该行。问题是某些表包含数百万行,我想在数据库端更有效率,所以我只从网络中获取所需的行。

是否可以直接在SQL端执行此操作?

3 个答案:

答案 0 :(得分:3)

您可以使用视图ALL_TAB_COLUMNS搜索给定表格中的所有列:

DECLARE
  v_table_name VARCHAR2(30) := 'dual';
  v_search_string VARCHAR2(100) := 'X';
  v_sql VARCHAR2(4000);
  c_result SYS_REFCURSOR;
BEGIN
  v_sql := 'SELECT * FROM ' || v_table_name || ' WHERE 1=1';
  FOR r_c IN (SELECT column_name
              FROM all_tab_columns
              WHERE table_name = v_table_name) LOOP
    v_sql := v_sql || ' OR ' || r_c.column_name || ' LIKE ''%' || v_search_string || '%''';
  END LOOP;
  OPEN c_result FOR v_sql;
END;
/

在这种情况下,您可以将其编写为过程并将游标返回到JAVA以获取数据。

仅 - 您将面对表格全部扫描。但是如果你看一下数据传输,那么这个解决方案比在JAVA中进行所有搜索更好。

答案 1 :(得分:0)

  

是否可以直接在SQL端执行此操作?

即可。在纯SQL 中是不可能的,因为您需要提前知道列名,即它们必须是静态

构建查询动态的唯一可行方法是(ab)在 PL / SQL 中使用EXECUTE IMMEDIATE

虽然,我会说这不是一个好的设计。应用程序必须事先知道要访问哪些对象。

无论如何,在PL / SQL中你可以做类似的事情:

v_sql = q'[SELECT ... FROM table_name WHERE ]';
v_sql:= v_sql || column_name1 || ' LIKE ''%f''' || ' OR '|| column_name2 || 'LIKE ''%f''';

然后,使用 EXECUTE IMMEDIATE 执行动态sql。

答案 2 :(得分:0)

您必须通过“文本应用程序开发人员指南”阅读 http://docs.oracle.com/cd/B28359_01/text.111/b28303/query.htm#g1016054

可能是您可以连接所有数据列并在同一个表中的另一个添加列中更新,然后使用文本搜索来获取结果。