2012-04-10 3 views
1

親愛なるStackOverflowのメンバー、MySQLの:私は何かを明らかに見下ろすないんだけど、私は私の問題への解決策を見つけることができていないことを願っています「<column_name><values> IN」クエリ内の文字列を使用して

これまでのところ。

標準WHERE ... IN (1, 2, 3, 4)節を使用して、テーブルから特定の列値を取得する必要があります。 しかし、WHERE句の値は、'a:3:{i:0;s:3:"153";i:1;s:3:"211";i:2;s:3:"226";}'のような別のテーブルの列に格納された値に基づいて動的に構築する必要があります。抽出される値は、この例では153,211、および226であり、結果として節はWHERE <column> IN (153, 211, 226)となります。この文字列の書式設定は常に同じですが、値の数はさまざまです。

Iは

SELECT value from `column` WHERE <non-scary WHERE clause> INTO @valueString; 
SET @IDs = CONVERT(PREG_REPLACE('/[^\"]+\"([^\"]+)\".*/', '$1', PREG_REPLACE('/\"\;[^\"]+\"/', '\,\ ', @valueString )) USING UTF8); 

関数にpreg_replaceでいくつかの正規表現の策略を使用して、この文字列から実際の値を得ることができるからUDFは、ある[http://www.mysqludf.org/lib_mysqludf_preg/]、これ人々がRegExp/Replace関数を探しているときは、一般に推奨されているものです。 CONVERT()はそこにあります。なぜなら、PREG_REPLACEはわかりやすい文字列の代わりにBLOBを返すからです。

SELECT @IDs; 

実行し、これらのクエリを実行した後153, 211, 226(この例では)のように見える、私の値のリストを提供します。

ここで、WHERE ... IN節でこれらの値を使用するようMySQLに説得することができます。ナイーブクエリ

SELECT * FROM `table` WHERE id IN (SELECT @IDs); 

は(私は私は本当に理由を理解していないことを、認めざるを得ないように、しかし、唯一のリストの値の最初のために結果をバック与え、他のものを無視して文句はありませんそれはそうする)。

明らかに、Ruby、Python、Perlなどではこれはすべて自明ですが、技術的な理由から厳密にSQLで行う必要があります。同僚が私に与えた示唆の1つは、中間結果を書くために一時テーブルを使用することですが、それがどのように実装され、そして/または動作するのか分かりません。また、たくさんのループ、部分文字列、その他の醜さがなければ簡単にはできないと思っていますが、私は訂正しています。

私の問題の説明が多かれ少なかれ分かりますように願っています。私は洞察、アイデア、ヒントに感謝します。あなたの時間とマインドシェア、コンスタンブロンデル、ライプツィヒDE

+1

なぜ変数@IDsが必要ですか? **サブクエリ**や**テンポラリテーブル**を使用できませんか?そうすれば、 'SELECT * FROM' table' WHERE id IN(サブテーブルからSELECT ID); 'を簡単に行うことができます。あなたのデータに奇妙な文字が含まれていれば、 ""、/ \ ";"注射やクエリの破損を防ぐことができます。 – Konerak

答えて

0

を事前に

おかげで、それが正常に動作しますあなたのwhere句にサブクエリを選択します。

+0

アドバイスをいただきありがとうございます。とにかく実装することができなかった何かをもっと必要としています。私はあなたの推薦を含むいくつかのオプションを試してみましたが、問題はまだあり、数字は個々の数字ではなく数字の文字列として使用されます。 しかし、私はそれを最終的には、ストアドファンクションを使用して、いくつかの文字列操作を回避することができました。 いずれにせよ、私は上司にSQLではなくスクリプト言語でそれを行うよう説得しました。 乾杯! –

関連する問題

 関連する問題