使用DB2數據庫的Im。什麼是合適的SQL查詢來確定列是否存在於表或列表中?DB2:如何查找列表是否存在於表格或表格列表中?
e.g
if "column_name" is found in "table name" or [list of table names]
return true or the name of tables that have that column.
非常感謝。
使用DB2數據庫的Im。什麼是合適的SQL查詢來確定列是否存在於表或列表中?DB2:如何查找列表是否存在於表格或表格列表中?
e.g
if "column_name" is found in "table name" or [list of table names]
return true or the name of tables that have that column.
非常感謝。
使用SYSCAT.COLUMNS
catalog view:
SELECT TABNAME
FROM SYSCAT.COLUMNS
WHERE
TABNAME IN ('table name 1', 'table name 2') AND
COLNAME = 'column_name';
在測試了DB2的z/OS 9.1和LUW 9.7:
SELECT STRIP(TBCREATOR) || '.' || STRIP(TBNAME)
FROM SYSIBM.SYSCOLUMNS
WHERE NAME = 'your_col'
AND TBNAME IN ('list', 'of', 'tables')
如果你只是想從一個特定的模式的結果,你可能會添加AND TBCREATOR = 'your_schema'
到的結束查詢。
另一種方式做,這是錯誤處理:
declare v_sql varchar(1000);
declare col_missing integer default 0;
declare col_does_not_exist condition for sqlstate '42703';
declare continue handler for col_does_not_exist set col_missing = 1;
set v_sql = 'select table.foo from table';
execute immediate v_sql;
if col_missing = 1 then
--Do something if column foo doesn't exist.
end if;
這種方法將工作會話表,你也可以用它在物體上,即使你不知道它是否是一個表,視圖,別名等。
指定table.foo
而不是列名稱很重要,否則稱爲foo
的另一個對象(如變量)的存在會打破測試。
該繼續處理程序將屏蔽在該範圍內缺少的列的任何其他錯誤,因此最好將範圍限制爲您想要執行的測試。
感謝您的回答,我確實希望檢查來自特定模式的表格。我嘗試添加你建議的那一行,但是這個任務沒有任何回報(我給了它一個我知道存在的列的名字)。 您可以請給我解釋一下查詢的工作原理嗎? 謝謝 – 2012-01-05 16:33:24
對不起,錯字:任務是*請求 – 2012-01-05 16:39:59
什麼可能會搞砸你的是你不添加架構到where子句的TBNAME'部分。比方說,你正在尋找一個名爲'UPDATE_TIMESTAMP'的列,它可能在'SCH.TAB1'或'SCH.TAB2'中,你認爲它可能在'SCH.TAB3'中(但事實並非如此)。你的查詢將是'SELECT STRIP(TBCREATOR)|| '' || STRIP(TBNAME) FROM SYSIBM.SYSCOLUMNS 其中name = 'UPDATE_TIMESTAMP' 和TBNAME IN( 'TAB1', 'TAB2', 'TAB3') AND TBCREATOR =「SCH'' – bhamby 2012-01-05 17:51:17