【问题标题】:SQL Update with variable for an equationSQL 更新方程的变量
【发布时间】:2012-02-08 17:29:33
【问题描述】:

我想问一下如何简化以下准备好的语句,因此对于每个 'sytosc + ?',它只使用 2 个,而不是 3 个问号 (?)我设置了相同的值。

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 兼容的解决方案,因为这是我在这个项目中使用的。

【问题讨论】:

    标签: java mysql sql prepared-statement


    【解决方案1】:
    UPDATE zawodnicy SET sytosc = LEAST( 100, sytosc + ? )
    WHERE id = ?
    

    【讨论】:

    • 谢谢。这就是我所追求的。我接受它,因为它完全适合我的特定问题。我只是想知道,对于更复杂的情况是否有解决方案(除了@JB Nizet 提供的),您在整个查询中引用相同的值?
    • 我目前想不出任何通用的解决方案,有时可以通过简化查询来避免它。
    【解决方案2】:

    您可以使用 Spring 的 NamedParameterJdbcTemplate,并使用如下查询:

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

    查看http://static.springsource.org/spring/docs/3.1.x/spring-framework-reference/html/jdbc.html获取Spring的JDBC支持文档,它还有其他优点。

    【讨论】:

    • 感谢您,为此 +1。你还知道 Spring 独立的解决方案吗?
    • 没有。但是你可以使用这个类,而不必使用 IOC 和 Spring 提供的所有其他东西。
    • 再次感谢,这确实是非常有趣的课程。它可能在将来用于更复杂的情况。现在我会选择@piotrm 的答案,因为它非常适合我的简单情况。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多