如何将查询的结果用作另一个WHERE列?

问题描述:

我有一堆与是/否值的列。这是由它们的长度为3认定:如何将查询的结果用作另一个WHERE列?

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

我想指望所有对任何这些列的是行。

所以通常我会做:

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

但我不知道是否有另一个查询的WHERE子句中应用这些列名的方式。就像这样:

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" 

我在找的是一个行数,其中任何3长度的列都有'是'。

注意:我在bluemix上使用db2,但任何关于此的一般信息都会有所帮助。

+0

您的“正常”查询是要走的路。您可以使用“syscat.columns”中的信息执行[**动态查询**](https://*.com/questions/6785302/how-to-execute-an-sql-string-in-db2)你在问什么? –

对于这一点,你必须使用动态SQL,但你可以使用IN谓词更简单:

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

使用动态SQL可以生成的列的名字逗号从下列查询分离的列表:

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

所以这里的子查询确实没有必要 - 我仍然必须列出所有的列? –

+0

@TravisHeeter你不能直接在你的查询中使用子查询,你将用它来组成动态sql,这样你就可以生成列表'c1,c2,c3,c4,...'然后执行动态sql查询。 – 2017-10-16 14:38:38

+0

不幸的是我对db2并不熟悉,但这是你如何做到的。 – 2017-10-16 14:39:09