2012-01-12 2 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 업데이트에 로컬 변수를 할당하는 방법이 있는지 궁금합니다.

나는이 프로젝트에서 사용하고있는 솔루션 인 MySQL과 호환되는 솔루션에 크게 감사 할 것입니다.

답변

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

감사. 이것은 내가 한 것입니다. 나는 그것이 나의 특별한 문제를 완벽하게 받아들이 기 때문에 그것을 받아 들인다. 난 궁금해, 거기에 더 복잡한 상황에 대한 해결책 (다른 @ JB Nizet 제공), 어디에 쿼리를 통해 동일한 값을 참조하십시오? – 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

감사합니다. 스프링 독립 솔루션을 알고 계십니까? – Boro

+0

아니요. 그러나 IOC와 Spring이 제공하는 모든 것을 사용할 필요없이이 클래스를 사용할 수 있습니다. –

+0

다시 한번 감사 드리며, 이것은 참으로 흥미로운 수업입니다. 앞으로는 더 복잡한 상황에서 사용될 수 있습니다. 지금 당장은 @piotrm의 대답으로 간다. 나의 간단한 상황에 완벽하기 때문에. – Boro

관련 문제