在 ORACLE 中通过行搜索特定值
SEARCH THROUGH ROW FOR SPECIFIC VALUE IN ORACLE
我想在 Table 行中搜索 32 列,在每一列中搜索特定值和计数出现次数,是否可以查询整行而不用在 oracle 中键入每一列名称???
是的,这是可能的,但解决方案并不快,并且需要有关 xquery 的基本知识。
准备测试table
create table test_objects as select * from user_objects where rownum < 100;
select * from
xmltable('for $row in ora:view("test_objects")/ROW return count($row/*[contains(text(),$TO_SEARCH)])' passing 'N' as "TO_SEARCH" columns cnt number path '.');
查询对值中包含 "N" 的列进行计数。
如果您稍微更改一下查询,我们可以看到哪些列包含搜索值
select * from
xmltable('for $row in ora:view("test_objects")/ROW return <ROW><CNT>{count($row/*[contains(text(),$TO_SEARCH)])}</CNT><COLUMNS>{string-join($row/*[contains(text(),$TO_SEARCH)]/name(),", " )}</COLUMNS></ROW>' passing 'N' as "TO_SEARCH"
columns
cnt number path 'CNT'
, list_of_column varchar2(4000) path 'COLUMNS'
);
- 在 EMP table 上测试过,Oracle DB 安装应该可用(我猜)。
- 创建 sql 文本以在所有字段中进行搜索。
- 假设您有权访问
DBA_TAB_COLUMNS
,如果不能访问 USER_TAB_COLUMNS
,如果您拥有 table
- %KING% 是搜索词。
- SQL 字符串有 4000 个字符的限制。
- 这些 table 的所有者可以不同,因为您可能在不同的架构中拥有 table
下面可以是 运行 SQL Plus 或您选择的 SQL 客户端:)
VARIABLE cur REFCURSOR;
DECLARE
v_chr VARCHAR2(4000);
v_chr_tablename VARCHAR2(30) := 'EMP';
v_chr_searchterm VARCHAR2(100) := 'KING';
BEGIN
SELECT 'SELECT * FROM ' || v_chr_tablename || ' where '
|| RTRIM ( XMLAGG (XMLELEMENT (E, 'TO_CHAR('
||column_name
|| ')', ' || ').EXTRACT ( '//text()')
ORDER BY column_name).getStringVal (), ' || ')
||' like ''%' || v_chr_searchterm || '%'''
INTO v_chr
FROM DBA_TAB_COLUMNS
WHERE table_name = v_chr_tablename
AND owner = 'APPS';
OPEN :cur FOR v_chr;
END;
/
print cur;
我想在 Table 行中搜索 32 列,在每一列中搜索特定值和计数出现次数,是否可以查询整行而不用在 oracle 中键入每一列名称???
是的,这是可能的,但解决方案并不快,并且需要有关 xquery 的基本知识。
准备测试table
create table test_objects as select * from user_objects where rownum < 100;
select * from
xmltable('for $row in ora:view("test_objects")/ROW return count($row/*[contains(text(),$TO_SEARCH)])' passing 'N' as "TO_SEARCH" columns cnt number path '.');
查询对值中包含 "N" 的列进行计数。
如果您稍微更改一下查询,我们可以看到哪些列包含搜索值
select * from
xmltable('for $row in ora:view("test_objects")/ROW return <ROW><CNT>{count($row/*[contains(text(),$TO_SEARCH)])}</CNT><COLUMNS>{string-join($row/*[contains(text(),$TO_SEARCH)]/name(),", " )}</COLUMNS></ROW>' passing 'N' as "TO_SEARCH"
columns
cnt number path 'CNT'
, list_of_column varchar2(4000) path 'COLUMNS'
);
- 在 EMP table 上测试过,Oracle DB 安装应该可用(我猜)。
- 创建 sql 文本以在所有字段中进行搜索。
- 假设您有权访问
DBA_TAB_COLUMNS
,如果不能访问USER_TAB_COLUMNS
,如果您拥有 table - %KING% 是搜索词。
- SQL 字符串有 4000 个字符的限制。
- 这些 table 的所有者可以不同,因为您可能在不同的架构中拥有 table
下面可以是 运行 SQL Plus 或您选择的 SQL 客户端:)
VARIABLE cur REFCURSOR;
DECLARE
v_chr VARCHAR2(4000);
v_chr_tablename VARCHAR2(30) := 'EMP';
v_chr_searchterm VARCHAR2(100) := 'KING';
BEGIN
SELECT 'SELECT * FROM ' || v_chr_tablename || ' where '
|| RTRIM ( XMLAGG (XMLELEMENT (E, 'TO_CHAR('
||column_name
|| ')', ' || ').EXTRACT ( '//text()')
ORDER BY column_name).getStringVal (), ' || ')
||' like ''%' || v_chr_searchterm || '%'''
INTO v_chr
FROM DBA_TAB_COLUMNS
WHERE table_name = v_chr_tablename
AND owner = 'APPS';
OPEN :cur FOR v_chr;
END;
/
print cur;