10

データベースから複数の列を選択しようとしていますが、すべての列ではありません。選択したい列はすべて「単語」で始まります。

したがって、疑似コードでこれを行いたいと思います:

SELECT "word%" from searchterms where onstate = 1;

多かれ少なかれ。これを行う方法に関するドキュメントが見つかりません-MySQLで可能ですか? 基本的に、識別子を使用して単語のリストを 1 行に格納しようとしています。レコードを取得するときに、すべての単語をその識別子に関連付けたいと考えています。すべての単語は文字列として結合され、配列/辞書内の別の関数に識別子とともに渡されます。

迅速なコードを維持するために、データベース呼び出しをできるだけ少なくしようとしています。

わかりました、ここで皆さんに別の質問があります:

「単語」という名前の可変数の列があります。行ごとに生成されたPythonクエリを使用して、行ごとに個別のデータベース呼び出しを実行する方が高速でしょうか?それとも、単純に SELECT * を使用して必要な列のみを使用する方が高速でしょうか? SELECT * NOT XYZ と言うことができますか?

4

4 に答える 4

10

いいえ、SQL はそのような選択を行うための構文を提供しません。

できることは、最初に MySQLに列名のリストを要求してから、その情報から SQL クエリを生成することです。

SELECT column_name
FROM information_schema.columns
WHERE table_name = 'your_table'
    AND column_name LIKE 'word%'

列名を選択しましょう。次に、Python で次のことができます。

"SELECT * FROM your_table WHERE " + ' '.join(['%s = 1' % name for name in columns])

文字列連結を使用する代わりに、代わりにSQLAlchemyを使用して SQL を生成することをお勧めします。

ただし、列の数を制限するだけであれば、このような動的クエリを実行する必要はまったくありません。データベースにとって大変な作業は、行を選択することです。10 列のうち 5 列を送信しても、10 列すべてを送信してもほとんど違いはありません。

その場合は、 a"SELECT * FROM ..."を使用し、Python を使用して結果セットから列を選択します。

于 2012-07-13T08:29:11.057 に答える
1

を使用して、最初に列名のリストを生成できます

SHOW COLUMNS IN tblname LIKE "word%"

次に、カーソルをループし、上記のクエリのすべての列を使用して SQL ステートメントを生成します。

"SELECT {0} FROM searchterms WHERE onstate = 1".format(', '.join(columns))
于 2012-07-13T08:32:29.670 に答える
1

いいえ、選択する列のリストを動的に生成することはできません。最終クエリでハードコーディングする必要があります。

現在のクエリは、1 つの列を含む結果セットを生成し、その列の値は、"word%"条件を満たすすべての行の文字列になります。

于 2012-07-13T08:28:38.000 に答える
0

これは役に立ちます: MySQL ワイルドカードを選択する

結論として、MySQL で直接行うことはできません。

汚い回避策としてできることは、最初のクエリ(http://dev.mysql.com/doc/refman/5.0/en/show-columns.html)を使用してテーブルからすべての列名を取得し、比較することです名前がパターンと一致する場合は python 。その後、次のように、見つかった列名を使用して MySQL select ステートメントを実行できます。

SELECT word1, word2, word3 from searchterms where onstate = 1;
于 2012-07-13T08:36:08.677 に答える