仅当行包含值小于1的列时才获取行

时间:2013-11-14 16:07:54

标签: mysql sql jdbc

我无法轻易更改数据库架构/设计,因此我需要以下情况的帮助。

每个对象都有一行,它有自己唯一的ID(匹配表主键 - 保证最多只能有一行)。

id (int; prim key),field1 (int), field2 (int), ...... (int), fieldn (int)

我想做SELECT * FROM table WHERE id = 1 AND ANY_FIELD < 1之类的事情。显然,这不存在。该行包含较少的列(几十个 - 因此我根本无法轻松完成WHERE field1 < 1 Or field2 < 1 OR ...。)

我想过做SELECT * FROM (DESC table A) WHERE A.Field.Value < 1之类的事情(。但不存在.Value。)

我只想要一个查询(对子查询很好)。

它现在的工作原理是它扫描每一列并手动检查,非常慢。

感谢您的帮助。

3 个答案:

答案 0 :(得分:0)

我担心这是不可能的。您可以动态构造一个包含所有列的预准备语句,然后执行该语句。但是在单个查询中无法实现。您必须创建动态语句,然后执行它。

答案 1 :(得分:0)

远照:您可以从信息模式中获取所有字段名称,以便对所有行进行求和(请参阅this random google hit)。如果您减去ID,则总共需要查找所有行。

这会让你关闭,但仍然是0 + 0 + 3仍然是3,所以你不能只检查总行数是否大于SUM - &gt;你需要自己在这个查询中添加一些检查以解决这个问题,但我相信这可能是可行的。 (要么只检查&lt; 0行并添加那些,或某种形式的IF计数&gt; 1为1)

如果链接消失:这是该论坛中添加所有整数行的查询。

SET @qry = (SELECT CONCAT('SELECT SUM(',GROUP_CONCAT(INFORMATION_SCHEMA.COLUMNS.COLUMN_NAME SEPARATOR '+'), ')
 FROM ',INFORMATION_SCHEMA.COLUMNS.TABLE_NAME,' 
 WHERE date_column BETWEEN \'2008-01-01\' AND \'2008-12-31\' ')
FROM INFORMATION_SCHEMA.COLUMNS
WHERE INFORMATION_SCHEMA.COLUMNS.TABLE_NAME = 'table_name'
AND INFORMATION_SCHEMA.COLUMNS.DATA_TYPE = 'int');
PREPARE stmt FROM @qry;
EXECUTE stmt;

答案 2 :(得分:0)

这类似于@Nanne给出的答案,但是这个查询将构建像你用col1&lt;描述的那样的where子句。 1或col2&lt; 1 ....

SET @qry = (SELECT CONCAT('SELECT * FROM table1 where ',GROUP_CONCAT(INFORMATION_SCHEMA.COLUMNS.COLUMN_NAME SEPARATOR ' < 1 or '), ' < 1')
            FROM INFORMATION_SCHEMA.COLUMNS
            WHERE INFORMATION_SCHEMA.COLUMNS.TABLE_NAME = 'table1'
                  AND INFORMATION_SCHEMA.COLUMNS.COLUMN_NAME != 'id'
                  AND INFORMATION_SCHEMA.COLUMNS.DATA_TYPE = 'int');
PREPARE stmt FROM @qry;
EXECUTE stmt

这是SQLFiddle(这个网站整天都在上下)