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

DB2。选择表中包含值的所有列,db2,Db2,我希望在一个表中查找所有列名称,该表在任何给定记录中都包含一个值 即记录值中包含字符串的所有列。 “%ABC%”或“%QAW%”或“%IGH%” 如果可能,给我DB模式中的所有表和列,这样我就不必手动查询任何表 2016-06-15 所以我再进一步,我现在可以从每个表的每一行的每一列中得到所有的值。现在我需要看看这个值(v_值)是否存在于机场代码列表中。i、 e['LAS','LAX','BIL'] 我把所有的机场都放在一个表中,我想把它们读入数组 我在创建该数组并将数据放入其中时遇到问题。 这

我希望在一个表中查找所有列名称,该表在任何给定记录中都包含一个值

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

如果可能,给我DB模式中的所有表和列,这样我就不必手动查询任何表

2016-06-15

所以我再进一步,我现在可以从每个表的每一行的每一列中得到所有的值。现在我需要看看这个值(v_值)是否存在于机场代码列表中。i、 e['LAS','LAX','BIL'] 我把所有的机场都放在一个表中,我想把它们读入数组

我在创建该数组并将数据放入其中时遇到问题。 这是我到目前为止所拥有的。 看看待办事项

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

您可以使用
sysibm.syscolumns

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

您可以使用
sysibm.syscolumns

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

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

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


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

您需要在SYSTABLES上创建一个光标,返回系统中的所有表格。然后使用另一个游标返回给定表中的所有列名。一旦有了这些,您就可以构建一个动态语句,用于检查给定表中所有列的值。获取下一个表名并重新执行

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


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

所有“包含值的列”或与值匹配的所有*列名?所有“包含值的列”或与值匹配的所有*列名?抱歉,我可能没有正确解释。我想在任何给定记录中找到所有具有值的列。很抱歉,我可能没有正确解释。我想找到在任何给定记录中都有值的所有列。嗨,Charles。。请看我最新的问题,我还有一点。嗨,查尔斯。。请看我的最新问题,我有点进一步。