2016-06-13 68 views
0

我想查找表中包含任何给定记录中的值的所有列名称。DB2。选择包含值的表中的所有列

I.e包含记录值中字符串的所有列。 “%ABC%”或“%QAW%”或“%IGH%”

如果可能的话给我在DB模式中的所有表和列,所以我没有查询手动曾经表

2016-06-15

因此我进一步了解了一下,现在我可以从每个表的每一行中的每一列中获取所有值。现在我需要查看该值(v_value)是否存在于机场代码列表中。即['LAS','LAX','BIL'] 我有一张桌子上的所有机场,我想读取和排列。

我在创建该数组并获取数据时遇到了问题。 这是我到目前为止。 看那TODO的

CREATE OR REPLACE PROCEDURE "CMSDB"."TEST1" 
() 
LANGUAGE SQL 

SPECIFIC SQL3 
P1: BEGIN 
DECLARE v_tabschema VARCHAR(255); 
DECLARE v_tabname VARCHAR(255); 
DECLARE v_colname VARCHAR(255); 
DECLARE v_airport VARCHAR(255); 
DECLARE v_stmt VARCHAR(3000); 
DECLARE V_SQL VARCHAR(3000); 
DECLARE v_value VARCHAR(255); 
DECLARE SQLSTATE CHAR(5) DEFAULT '00000'; 
DECLARE v_stmt2 STATEMENT; 
DECLARE v_value_cursor CURSOR FOR v_stmt2; 

DECLARE v_airport_cursor CURSOR FOR select IDX from CMSDB.AIRPORTS; 
DECLARE syscat_cursor CURSOR FOR select trim(tabschema), tabname, colname from cmsdb.syscat.columns where tabname = 'ACCTGROUP' and tabschema = 'CMSDB' and TYPENAME = 'VARCHAR' and colname not in ('CHGDATE','CHGPAGE','CHGPROG','CHGTYPE','CHGUSER','CREATEDATETIME','CREATEDBYID','REC_ID'); 


    open v_airport_cursor; 
     FETCH FROM v_airport_cursor INTO v_airport; 
     WHILE (SQLSTATE = '00000') DO 
      call DBMS_OUTPUT.PUT_LINE(v_airport); 

      -- TODO Add each value to a list, arryalist that can be used to check if the v_value is in the list. 

      FETCH FROM v_airport_cursor INTO v_airport; 
     END WHILE; 

    close v_airport_cursor; 

    OPEN syscat_cursor; 
     FETCH FROM syscat_cursor INTO v_tabschema, v_tabname, v_colname; 
     WHILE (SQLSTATE = '00000') DO 
       --call DBMS_OUTPUT.PUT_LINE(v_tabschema || ' ' || v_tabname || ' ' || v_colname); 
       SET v_stmt = 'select ' || v_colname || ' from ' || v_tabschema || '.' || v_tabname; 
       --call DBMS_OUTPUT.PUT_LINE(v_stmt); 
       PREPARE v_stmt2 FROM v_stmt; 
       OPEN v_value_cursor; 
         FETCH FROM v_value_cursor INTO v_value; 
         WHILE (SQLSTATE = '00000') DO 
           -- TODO 
           --IF (airportList contains v_value) THEN 
             --call DBMS_OUTPUT.PUT_LINE(v_value); 
           --END IF; 
         FETCH FROM v_value_cursor INTO v_value; 
         END WHILE; 
       CLOSE v_value_cursor; 
       FETCH FROM syscat_cursor INTO v_tabschema, v_tabname, v_colname; 
     END WHILE; 
    close syscat_cursor; 
END P1 
+0

所有“包含值的列”或全部**列名*与值匹配吗? – Charles

回答

0

您可以使用sysibm.syscolumns

select colname 
from sysibm.syscolumns 
where tbname = 'XX' and 
     (name like %ABC%' or name like '%QAW%' or name like '%IGH%'); 
+0

对不起,我可能没有正确解释。 我想查找所有给定记录中有值的列。 – klind

0

这是一个非常奇怪的请求......也许是奇怪的我见过25年的IT工作。

你这样做的原因是什么?也许你认为你需要做的,“找到具有给定值的所有列”并不是最好的方法。

话虽这么说...

你需要创建一个光标在SYSTABLES返回系统中的所有表。然后有另一个游标返回给定表中的所有列名称。一旦你有了这些,你可以建立一个动态的语句,检查给定表中的所有列,查找你正在查找的值。获取下一个表名并重新执行。显然,如果你可以缩小搜索范围到一个特定的模式,甚至限制搜索到具有特定命名模式的表/列;你会过得更好。

另一种技术,取决于您的平台和DB2版本。您可能可以将某种批量导出操作做成一组文本文件。然后使用一个工具来清理这些文本文件的内容。

+0

嗨查尔斯..请看我更新的问题,我进一步了。 – klind

相关问题