IM à l'aide d'une base de données DB2. Quelle serait une requête SQL appropriée pour savoir si une colonne existe dans une table ou une liste de tables?
E.G P>
if "column_name" is found in "table name" or [list of table names] return true or the name of tables that have that column.
3 Réponses :
Utilisez syscat.columns code> Vue du catalogue
:
SELECT TABNAME FROM SYSCAT.COLUMNS WHERE TABNAME IN ('table name 1', 'table name 2') AND COLNAME = 'column_name';
Testé sur DB2 Z / OS 9.1 et LUW 9.7:
SELECT STRIP(TBCREATOR) || '.' || STRIP(TBNAME) FROM SYSIBM.SYSCOLUMNS WHERE NAME = 'your_col' AND TBNAME IN ('list', 'of', 'tables')
Merci pour la réponse, je veux vérifier les tables d'un schéma spécifique. J'ai essayé d'ajouter la ligne que vous avez suggérée mais la quête ne renvoie rien (je lui ai donné le nom d'une colonne que je connais). Pouvez-vous m'expliquer un peu plus comment fonctionne la requête? Merci
Désolé Typo: Quête est * Demande
Ce qui peut vous déconner, c'est que vous n'ajoutez pas le schéma à la partie code> tbname code> de la clause WHERE. Dire, par exemple, vous recherchez une colonne appelée update_timettamp code> qui pourrait être dans
sch.tab1 code> ou
sch.tab2 code>, et vous pensez Il peut être dans
sch.tab3 code> (mais ce n'est pas). Votre requête serait
Sélectionner une bande (tbcreator) || '.' || Bande (tbname) à partir de sysibm.syscolumns où nom = 'update_timetamp' et tbname dans ('Tab1', 'tab2', 'tab3') et tbcreator = 'sch' code>
Et la requête retournerait les noms de table formatés comme schema.tablename: sch.tab1 code> et
sch.tab2 code> (
sch.tab3 code> n'est pas retourné car la colonne n'est pas dans cette table). La partie code> code> élimine simplement les espaces, sinon vous obtiendriez quelque chose comme '
sch .TAB1 code>'
Si vous avez besoin de rechercher dans des tableaux pour plusieurs schéma, modifiez simplement l'égalité vers une comparaison code> dans code>. J'espère que cela pourra aider!
Une autre façon de le faire est avec la manipulation des erreurs:
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;