0

私のレポートは、次の 2 つの値のいずれかを受け入れます。

  1. ALL を示す文字列「*」、または
  2. 個人の ID を示す整数

だから、基本的に、私はクエリを持っています:

SELECT * FROM people where personid = ?

整数を渡すとレポートは完全に実行されますが、すべてを示す * を渡すとレポートが壊れます。また、クエリをそのままにして文字列を渡すと意味がありません。すなわちこれは動作します:

SELECT * FROM people where personid = 5

しかし、これはしません:

SELECT * FROM people where personid = *
  1. パラメータが渡された場合に「すべて」を返すようにこれを書き直すにはどうすればよいですか? つまり、値が * の場合は where 句を完全に無視できますが、値が整数の場合は where を実行する必要があります。

現在、エラーが発生した場合:

* を -1 に変更できます。したがって、別の方法は、-1 が渡された場合に制約を無視するように SQL を書き直すことです。次のようなもの:

SELECT * FROM people WHERE (param = -1 OR (param != -1 AND personid = param) )

..しかし、これはうまくいかないようですか?

4

4 に答える 4

2

*2 つのパラメーター (有効な整数値ではないため、使用する場合を除いて、同じ値を持つことができます) を渡し、条件を使用する必要があります。

SELECT * FROM people where CAST(? AS VARCHAR(20)) = '*' OR personid = ?

1 つ目は、すべてを選択するか (値が * の場合)、特定の人を選択するか (値がそれ以外の場合) を決定します。Firebird は位置パラメータのみをサポートするため、2 つのパラメータを使用する必要がありますが、それらに同じ値を指定できます (値が数値の場合のみ、 を使用する場合*は、もう一方のパラメータは単純に数値にする必要があります)。Firebird がパラメータを正しく解釈するには、キャストが必要であることに注意してください。

これが遅すぎる場合 (オプティマイザーがこれを好まない可能性があるため)、次の使用を検討する必要がありますUNION

SELECT * FROM people where personid = ?
UNION
SELECT * FROM people where CAST(? AS VARCHAR(20)) = '*'
于 2013-05-31T08:13:35.910 に答える
0

これはどうですか

SELECT * FROM people WHERE (personid = param OR ( param = -1  ))
于 2013-05-31T08:56:33.750 に答える
0

違うテクニックを使っています

String q="SELECT * FROM people where 1=1";
if PersonId>0 {
  q=q+" and personid="+PersonId.toString();
}
于 2013-05-31T06:41:58.050 に答える