在特定 table 中查找字符串
Find a string in a specific table
我正在使用 oracle 数据库,我想知道是否有办法找到在任何列中包含值的所有行。例如,让我们考虑这个 table:
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 动态搜索列中的给定值并添加该行。问题是一些 table 包含数百万行,我想在数据库端这样做会更有效率,所以我只从网络中获取想要的行。
可以直接在SQL这边做吗?
Is it possible to do it on the SQL side directly?
否。在 pure SQL 中是不可能的,因为您需要提前知道列名,即它们必须是 static.
动态构建查询的唯一可能方法是(ab)在PL/SQL[=29=中使用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.
您可以使用视图 ALL_TAB_COLUMNS
搜索给定 table:
中的所有列
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;
/
在这种情况下,您可以将其编写为过程和 return 游标到 JAVA 以获取数据。
仅 - 您将一直面临 table 全面扫描。但是,如果您查看数据传输,那么此解决方案将比在 JAVA.
中进行所有搜索更好
你必须通读 "Text Application Developer's Guide"
http://docs.oracle.com/cd/B28359_01/text.111/b28303/query.htm#g1016054
也许您可以连接所有数据列并在同一 table 中再添加一个列进行更新,然后使用文本搜索来获取结果。
我正在使用 oracle 数据库,我想知道是否有办法找到在任何列中包含值的所有行。例如,让我们考虑这个 table:
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 动态搜索列中的给定值并添加该行。问题是一些 table 包含数百万行,我想在数据库端这样做会更有效率,所以我只从网络中获取想要的行。
可以直接在SQL这边做吗?
Is it possible to do it on the SQL side directly?
否。在 pure SQL 中是不可能的,因为您需要提前知道列名,即它们必须是 static.
动态构建查询的唯一可能方法是(ab)在PL/SQL[=29=中使用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.
您可以使用视图 ALL_TAB_COLUMNS
搜索给定 table:
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;
/
在这种情况下,您可以将其编写为过程和 return 游标到 JAVA 以获取数据。
仅 - 您将一直面临 table 全面扫描。但是,如果您查看数据传输,那么此解决方案将比在 JAVA.
中进行所有搜索更好你必须通读 "Text Application Developer's Guide" http://docs.oracle.com/cd/B28359_01/text.111/b28303/query.htm#g1016054
也许您可以连接所有数据列并在同一 table 中再添加一个列进行更新,然后使用文本搜索来获取结果。