2012-01-12 10 views
3

は、次の準備文を簡略化するため、それぞれの 'sytosc +?'のように3つの疑問符(?)の代わりに2つだけを使用します。私は同じ値を設定しています。式の変数を使用したSQLの更新

PreparedStatement psUp = conn.prepareStatement("UPDATE zawodnicy " 
    + "SET sytosc = CASE WHEN (sytosc + ? > 100) THEN 100 ELSE sytosc + ? END " 
    + "WHERE id=?"); 

私はあなたが行うことができますSQLで知っている:これらが効果的に二つの文であるため、

SET @a = 25; 
UPDATE zawodnicy SET sytosc = CASE WHEN (sytosc + @a > 100) 
THEN 100 ELSE sytosc + @a END WHERE id = 1 

明らかにあなたは、このプリペアドステートメントにそれを置くことはできません。

「sytosc +?」の最初の評価でこの種のSQL Updateでローカル変数を割り当てる方法が実際にあるのだろうか?

私はこのプロジェクトで使用しているように、MySQLと互換性のあるソリューションを高く評価します。

答えて

2
UPDATE zawodnicy SET sytosc = LEAST(100, sytosc + ?) 
WHERE id = ? 
+0

ありがとうございます。これは私が後にしたものです。私はそれが私の特定の問題に完全に合っているのでそれを受け入れる。私は疑問に思っています。より複雑な状況の解決策(NJet以外の@JB)では、クエリ全体に同じ値を参照していますか? – Boro

+0

今のところ普遍的な解決策は考えられません。クエリを避けるためにクエリを単純化することもできます。 – piotrm

2

あなたは春のNamedParameterJdbcTemplateを使用して、次のようなクエリを使用することができます。

UPDATE zawodnicy SET sytosc = 
CASE WHEN (sytosc + :offset > 100) 
    THEN 100 
    ELSE sytosc + :offset 
END 
WHERE id = :id 

は他の利点を持っているSpring'sJDBC支援、のドキュメントについてはhttp://static.springsource.org/spring/docs/3.1.x/spring-framework-reference/html/jdbc.htmlを参照してください。

+0

これはありがとうございます。あなたはSpringの独立したソリューションも知っていますか? – Boro

+0

いいえ。ただし、IOCとSpringが提供するその他すべてを使用することなくこのクラスを使用できます。 –

+0

もう一度ありがとう、これは本当に面白いクラスです。将来的にはより複雑な状況で使用される可能性があります。今のところ私は@piotrmの答えで行くつもりです、それは私の単純な状況には完璧です。 – Boro

関連する問題