0

DBのスキーマ/設計を簡単に変更できないので、次のような状況で助けが必要です。

独自の一意の ID を持つオブジェクトごとに 1 つの行があります (テーブルの主キーと一致します - 最大で 1 つの行のみであることが保証されます)。

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は存在しません)のようなことを考えました。

クエリを 1 つだけ希望します (サブクエリで問題ありません)。

現在、各列をスキャンして手動でチェックしているため、非常に時間がかかります。

助けてくれてありがとう。

4

3 に答える 3

0

これは @Nanne の回答に似ていますが、このクエリは、col1 < 1 または col2 < 1 .... で記述したような where 句を作成します。

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

ロングショットとして:情報スキーマからすべてのフィールド名を取得して、すべての行の合計を作成できます(このランダムなグーグルヒットを参照してください)。を引くとID、探しているすべての行の合計が得られます。

これで終わりですが、それでも 0+0+3 はまだ 3 であるため、行の総数が SUM よりも多いかどうかを確認することはできません -> それを修正するには、このクエリにいくつかのチェックを自分で追加する必要があります。しかし、私はそれが実行可能であると信じています。(<0 行のみをチェックしてそれらを追加するもの、または >1 を 1 としてカウントする何らかの形式の IF のいずれか)

リンクが消えた場合: これは、すべての整数行を追加するそのフォーラムからのクエリです。

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 に答える