2013-06-21 103 views
0

是否可以在特定表的每個字段中搜索Oracle中的值列表。要求是從表中提取所有與列表匹配的詳細信息在table.The表的列存放大量的數據,我需要提取數據,爲期6個月的在Oracle中搜索每個字段的特定表中的值列表

+1

您可以從這裏開始:[搜索特定值的所有表中的所有字段(Oracle)](http://stackoverflow.com/q/208493/319875) –

+0

要搜索多少列?價值清單要多長時間?什麼是數據類型(數字,字符,日期?) –

+0

嗨wol,character&varchar數據類型和klist大約有120個值 – Sam

回答

0

我想創建一個表來保存搜索值

CREATE TABLE s (x VARCHAR2(30) PRIMARY KEY) ORGANIZATION INDEX; 
INSERT INTO s VALUES ('x'); 
INSERT INTO s VALUES ('y'); 
INSERT INTO s VALUES ('z'); 
COMMIT; 
EXEC DBMS_STATS.GATHER_TABLE_STATS(null, 's'); 

,然後構造長列查詢逐列檢查:

SELECT * FROM large_table 
WHERE col1 IN (SELECT x FROM s) 
    OR col2 IN (SELECT x FROM s) 
    ... 
    OR colx IN (SELECT x FROM s); 

如果列數是巨大的,我會使用SQL來幫助編寫查詢:

SELECT 'OR '||column_name||' IN (SELECT x FROM s)' AS line 
    FROM user_tab_columns 
WHERE table_name = 'large_table'; 
+0

@a_horse_with_no_name:啊,來吧,別挑剔我。有用。表名在DBMS_STATS中不區分大小寫(當然除了「mixedCaseTableNames」)。 –

0
CREATE TABLE large_table 
(
    col1 VARCHAR2(100) 
, col2 VARCHAR2(100) 
, col3 VARCHAR2(100) 
, col4 VARCHAR2(100) 
, col5 VARCHAR2(100) 
); 

INSERT INTO large_table VALUES ('aa', 'bb', 'cc', 'dd', 'ee'); 
INSERT INTO large_table VALUES ('ax', 'bx', 'cx', 'dx', 'ex'); 
INSERT INTO large_table VALUES ('ay', 'by', 'cy', 'dd', 'ee'); 

CREATE TABLE values_to_search 
(
    s_value VARCHAR2(30) 
); 

INSERT INTO values_to_search VALUES ('aa'); 
INSERT INTO values_to_search VALUES ('bb'); 
INSERT INTO values_to_search VALUES ('cc'); 
INSERT INTO values_to_search VALUES ('dd'); 
INSERT INTO values_to_search VALUES ('ee'); 

SELECT CASE WHEN EXISTS(SELECT 1 FROM values_to_search s WHERE INSTR(l.col1, s.s_value) > 0) THEN 1 ELSE NULL END AS s1 
,  CASE WHEN EXISTS(SELECT 1 FROM values_to_search s WHERE INSTR(l.col2, s.s_value) > 0) THEN 1 ELSE NULL END AS s2 
,  CASE WHEN EXISTS(SELECT 1 FROM values_to_search s WHERE INSTR(l.col3, s.s_value) > 0) THEN 1 ELSE NULL END AS s3 
,  CASE WHEN EXISTS(SELECT 1 FROM values_to_search s WHERE INSTR(l.col4, s.s_value) > 0) THEN 1 ELSE NULL END AS s4 
,  CASE WHEN EXISTS(SELECT 1 FROM values_to_search s WHERE INSTR(l.col5, s.s_value) > 0) THEN 1 ELSE NULL END AS s5 
FROM large_table l; 
/* 
1 1 1 1 1 

      1 1 
*/ 

CREATE TABLE search_result 
(
    col1 VARCHAR2(100) 
, col2 VARCHAR2(100) 
, col3 VARCHAR2(100) 
, col4 VARCHAR2(100) 
, col5 VARCHAR2(100) 
); 

INSERT INTO search_result 
SELECT /*+ PARALLEL */ * 
FROM large_table l 
WHERE COALESCE 
     (
       CASE WHEN EXISTS(SELECT 1 FROM values_to_search s WHERE INSTR(l.col1, s.s_value) > 0) THEN 1 ELSE NULL END 
     ,  CASE WHEN EXISTS(SELECT 1 FROM values_to_search s WHERE INSTR(l.col2, s.s_value) > 0) THEN 1 ELSE NULL END 
     ,  CASE WHEN EXISTS(SELECT 1 FROM values_to_search s WHERE INSTR(l.col3, s.s_value) > 0) THEN 1 ELSE NULL END 
     ,  CASE WHEN EXISTS(SELECT 1 FROM values_to_search s WHERE INSTR(l.col4, s.s_value) > 0) THEN 1 ELSE NULL END 
     ,  CASE WHEN EXISTS(SELECT 1 FROM values_to_search s WHERE INSTR(l.col5, s.s_value) > 0) THEN 1 ELSE NULL END 
     ) IS NOT NULL 
; 
-- 2 rows inserted. 
/* 
aa bb cc dd ee 
ay by cy dd ee 
*/ 

有了,我們有沒有錯誤的答案數量的信息。

添加一些條件。希望你創建了一些索引 - 這是一個很好用的列。

請勿掃描整個表格 - 使用日期範圍,例如:逐日或逐月。

相關問題