2017-10-16 21 views
1

J'ai un tas de colonnes avec des valeurs oui/non. Ceux-ci sont identifiés par leur longueur étant 3:Comment utiliser les résultats d'une requête en tant que colonnes WHERE dans un autre?

SELECT colname 
    FROM syscat.columns 
    WHERE tabname='CL' 
    AND length = 3 

J'aimerais compter toutes les lignes qui ont un oui pour l'une de ces colonnes.

Donc, normalement, je ferais:

SELECT COUNT(*) 
    FROM CL 
    WHERE c1=yes or c2=yes or c3=yes #... 

Mais je me demande s'il y a un moyen d'appliquer les noms de colonnes dans la clause WHERE d'une autre requête. Quelque chose comme ceci:

SELECT COUNT(sub.*) 
    FROM (
    SELECT colname 
     FROM syscat.columns 
     WHERE tabname='CL' 
     AND length = 3 
) sub 
    WHERE [sub] = yes #How can I say "The VALUE of each column name from the subquery" 

Ce que je suis à la recherche est un nombre de lignes où une colonne 3 longueur a un « oui ».

Remarque: J'utilise db2 sur bluemix, mais toute information générale à ce sujet serait utile.

+0

Votre requête "normalement" est la bonne façon de procéder. Vous pouvez faire une [** requête dynamique **] (https://stackoverflow.com/questions/6785302/how-to-execute-an-sql-string-in-db2) en utilisant les informations de "syscat.columns" Est-ce cela que vous demandez? –

Répondre

3

Pour cela, vous devez utiliser SQL dynamique, mais vous pouvez le rendre plus simple en utilisant le IN prédicat:

SELECT COUNT(*) 
FROM CL 
WHERE yes in(c1, c2, c3, c4, ....) 

utilisant SQL dynamique, vous pouvez générer la liste des noms des colonnes séparées par des virgules de la requête suivante:

SELECT colname 
FROM syscat.columns 
WHERE tabname='CL' 
    AND length = 3 
+0

Donc, la sous-requête n'est vraiment pas nécessaire ici - je devrais encore énumérer toutes les colonnes? –

+0

@TravisHeeter Vous ne pouvez pas utiliser la sous-requête directement dans votre requête, vous allez utiliser pour composer le SQL dynamique afin que vous puissiez générer la liste 'c1, c2, c3, c4, ...' puis exécuter la requête SQL dynamique. –

+0

Malheureusement, je ne suis pas familier avec DB2, mais voici comment vous pouvez le faire. –