【问题标题】:Find a string in a specific table在特定表中查找字符串
【发布时间】:2015-04-25 17:04:08
【问题描述】:

我正在使用 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 端进行?

【问题讨论】:

  • 所以列和值都是用户输入?
  • @AniketThakur 不只是值,否则它只是一个带有 where 子句的简单 sql 查询
  • 您需要知道哪个表用户正在尝试查询。这样你就可以在一个函数中获取它的所有列,然后在每一列上使用where 条件构建一个查询。
  • 如果您事先不确定列名,那么显然您无法进行静态查询。因此,唯一可能的方法是(ab)在 PL/SQL 中使用动态 SQL。
  • 你可以参考这个:[MS-SQL][1][1]:stackoverflow.com/questions/709120/…

标签: java sql oracle oracle11g


【解决方案1】:

您可以使用视图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 以获取数据。

仅 - 您将始终面临表 FULL 扫描。但是如果你看一下数据传输,那么这个解决方案会比在 JAVA 中进行所有搜索要好。

【讨论】:

    【解决方案2】:

    是否可以直接在 SQL 端进行?

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

    动态构建查询的唯一可能方法是在PL/SQL中(ab)使用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。

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-08-06
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多