1

「IN」句を含む select ステートメントを含むデータセットを BIRT レポートに作成し、「?」の代わりにコンマ区切りの値を渡そうとしています。複数の値を受け入れる BIRT パラメータを使用します。

例: select * from table where ID in (?)

これをデータセット「select * from table where ID in (params["paramer_name"].value)」に追加しようとしましたが、機能しません。

クエリで "IN" 句を使用すると、データベース サーバーでクエリのコストが大幅に削減されるため、BIRT データセットの組み込みフィルターを使用したくありません。

長いJavaスクリプトを追加せずに同じことを行う簡単な方法はありますか???

参考までに: ユーザーが選択したパラメーターのリストは別のデータセットからのものであり、選択した値を別のデータセットへの入力として使用したいと考えています。

助けてくれてどうもありがとう...

4

1 に答える 1

6

これは、通常の SQL パラメータ '?' では実行できません。

回避策は、この「?」を置き換えることです。クエリのデフォルト値によって、データセットの「beforeOpen」スクリプトに適切なコンマ区切りの値のリストを動的に挿入します。

デフォルトのクエリ

ID のデータ型が整数であると仮定すると、次のようにクエリを設定します (もちろん、データをプレビューできるようにするために、ここでは有効な ID を使用します)。

select * from table where ID in ( 1000 )

データセットの「beforeOpen」スクリプト:

   this.queryText=this.queryText.replaceAll('1000',params["parameter_name"].value.join(","));

このように、「parameter_name」が 1100、1200、1300 の 3 つの値を返す場合、データベースに送信されるクエリは次のようになります。

select * from table where ID in ( 1100,1200,1300)

ID のデータ型が文字列の場合も同様で、引用符で少し操作する必要があります。ただし、文字列型では、この種の処理により SQL インジェクション攻撃が可能になるため、最初にパラメーター値が期待どおりかどうかを確認する必要があります。

于 2013-09-04T08:14:03.187 に答える