0

同じクエリへの入力としてコンマ区切りの ID 文字列を使用したいと考えています。

すなわち:

Set @IDs := '';

Select @IDs := CAST(GROUP_CONCAT(DISTINCT CAST(`id` as CHAR)) AS Char) AS 'ID String',
(
 Select FORMAT(Sum(`Quantity`),0)
 from 'My Table'
 Where `ID` IN (@IDs)
 ) As 'Quantity'

From `My Table`

実際のクエリははるかに複雑ですが、達成する必要があるのは、コンマ区切りの ID 文字列を変数に割り当て、その文字列を IN 句内のサブクエリで使用することです。

上記は機能していません。フィードバックをいただければ幸いです。

ありがとうございました!

4

1 に答える 1

0

MySQL が認識するのは文字列値です。文字列にコンマが含まれていても、その値を値のリストとして解釈しません。

例を挙げて説明しましょう:

 SET @bar = 'fee,fi,fo,fum';
 SELECT * FROM mytable t WHERE t.foo IN (@bar) ;

それは同等です

 SELECT * FROM mytable t WHERE t.foo = 'fee,fi,fo,fum'

MySQL は@bar単一の値として認識します。1 つ以上のカンマが含まれていてもかまいません。これは単なる文字列リテラルです。SQL テキストとして解釈されません。これらのコンマは、文字列内の単なる文字です。


この制限に対する回避策の 1 つは、"動的 SQL" を使用することです。これにより、任意の文字列を SQL ステートメントとして実行できます。必要なテキストを変数に構築/連結し、SQL ステートメントのように (MySQL ストアド プロシージャ内で) 変数の内容を実行できます。ユース ケースでは複数のステートメントが必要になります。ただし、これは十分注意してください。これにより、コードが悪質な SQL インジェクションの脆弱性にさらされる可能性があるためです。) 解決しようとしている問題がそのレベルの複雑さを保証するものではないため、例を挙げるつもりはありません。


質問のクエリは、これと同等の結果を返そうとしているようです:

SELECT GROUP_CONCAT(DISTINCT t.id) AS `ID String`
     , FORMAT(SUM(t.quantity),0)   AS `Quantity`
  FROM `My Table` t
 WHERE t.id IS NOT NULL

関数によって返される文字列の長さ(変数の設定、および変数) には制限があることに注意してください。制限を超えた場合、MySQL はエラーや警告を発行せず、正常に完了し、許容される最大長に切り捨てられた文字列を返します。GROUP_CONCATgroup_concat_max_lenmax_allowed_packet

サブクエリが必要な理由、またはid列の値が関数によって返される ID の「リスト」に含まれる値の 1 つであるかどうかを確認する必要がある理由は、まったく明確ではありませんGROUP_CONCAT。(たぶん、仕様に私が理解していない何かがあります。)

于 2014-10-22T22:53:55.707 に答える