0

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

每个对象都有一行具有自己的唯一 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不存在)。

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

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

谢谢你的帮助。

4

3 回答 3

0

这类似于@Nanne 给出的答案,但是这个查询将构建 where 子句,就像你用 col1 < 1 或 col2 < 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(这个网站一整天都在上下波动)

于 2013-11-14T17:33:50.273 回答
0

作为一个长镜头:您可以从信息模式中获取所有字段名称,以对所有行进行 SUM(请参阅这个随机的 google hit)。如果减去ID,则总共有要查找的所有行。

这会让你接近,但 0+0+3 仍然是三,所以你不能只检查总行数是否超过 SUM -> 你需要自己在这个查询中添加一些检查来解决这个问题,但我相信这可能是可行的。(要么只检查 <0 行并添加这些行,要么某种形式的 IF 将 >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;
于 2013-11-14T16:17:54.137 回答
0

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

于 2013-11-14T16:11:33.840 回答