DB2。选择包含值的表中的所有列

时间:2016-06-13 23:23:20

标签: db2

我想在表中找到包含任何给定记录中值的所有列名。

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

如果可能的话,给我一个DB模式中的所有表和列,所以我不必手动查询表格

2016年6月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

2 个答案:

答案 0 :(得分:0)

您可以使用sysibm.syscolumns

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

答案 1 :(得分:0)

您需要在SYSTABLES上创建一个返回系统中所有表的游标。然后有另一个游标返回给定表中的所有列名。完成后,您可以构建一个动态语句,检查给定表中的所有列以查找您要查找的值。获取下一个表名并重新执行。

显然,如果您可以将搜索范围缩小到特定模式,甚至将搜索限制为具有特定命名模式的表/列;你会好起来的。

另一种技术,取决于您的平台和DB2版本。您可以对一组文本文件进行批量导出。然后使用一个工具来搜索这些文本文件的内容。

相关问题