6
votes

DB2: Comment puis-je trouver si une colonne est présente dans une table ou une liste de tables?

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.


0 commentaires

3 Réponses :


5
votes

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';


0 commentaires

8
votes

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')


5 commentaires

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 tbname de la clause WHERE. Dire, par exemple, vous recherchez une colonne appelée update_timettamp qui pourrait être dans sch.tab1 ou sch.tab2 , et vous pensez Il peut être dans sch.tab3 (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'


Et la requête retournerait les noms de table formatés comme schema.tablename: sch.tab1 et sch.tab2 ( sch.tab3 n'est pas retourné car la colonne n'est pas dans cette table). La partie élimine simplement les espaces, sinon vous obtiendriez quelque chose comme ' sch .TAB1 '


Si vous avez besoin de rechercher dans des tableaux pour plusieurs schéma, modifiez simplement l'égalité vers une comparaison dans . J'espère que cela pourra aider!



0
votes

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;


0 commentaires