如何将查询的结果用作另一个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,但任何关于此的一般信息都会有所帮助。
对于这一点,你必须使用动态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
所以这里的子查询确实没有必要 - 我仍然必须列出所有的列? –
@TravisHeeter你不能直接在你的查询中使用子查询,你将用它来组成动态sql,这样你就可以生成列表'c1,c2,c3,c4,...'然后执行动态sql查询。 – 2017-10-16 14:38:38
不幸的是我对db2并不熟悉,但这是你如何做到的。 – 2017-10-16 14:39:09
您的“正常”查询是要走的路。您可以使用“syscat.columns”中的信息执行[**动态查询**](https://*.com/questions/6785302/how-to-execute-an-sql-string-in-db2)你在问什么? –