【问题标题】:SQL update, set, case: What am I doing wrong? [duplicate]SQL 更新、设置、案例:我做错了什么? [复制]
【发布时间】:2019-11-27 04:17:33
【问题描述】:

表:Person

+------+-------+
| name |  age  |
+------+-------+
| abc  |  NULL |
+------+-------+

我想在两种情况下更新age

  1. 如果表中的年龄为NULL,则将其设置为变量$year
  2. 如果表中的年龄是NOT NULL增加 $year

我有以下代码。但它不会在表格中更新我的年龄。我做错了什么?

$sql = "UPDATE `Person`
        SET age =
            CASE
                WHEN age == null THEN $year
                ELSE age + $year
            END
        WHERE name='abc'";
mysqli_query($conn, $sql);

【问题讨论】:

    标签: php mysql sql mysqli sql-update


    【解决方案1】:

    您不能通过执行age = null 直接将值与null 进行比较,因为null 没有类型并且有点“未定义”。您需要通过CASE WHEN age IS NULL 来检查值是否为空

    您还应该在这里使用准备好的语句,因为您直接在查询中处理变量。

    $name = 'abc';
    $sql = "UPDATE `Person`
            SET age =
                CASE
                    WHEN age IS NULL THEN ?
                    ELSE age + ?
                END
            WHERE name = ?";
    $stmt = $conn->prepare($sql);
    $stmt->bind_param("iis", $year, $year, $name);
    $stmt->execute();
    $stmt->close();
    

    您可以通过首先获取当前年龄来稍微减少参数的数量,如果它为空则为零,然后添加$year

    $name = 'abc';
    $sql = "UPDATE `Person`
            SET age = (CASE WHEN age IS NULL THEN 0 ELSE age END) + ?
            WHERE name = ?";
    $stmt = $conn->prepare($sql);
    $stmt->bind_param("is", $year, $name);
    $stmt->execute();
    $stmt->close();
    

    【讨论】:

    • 这不是'与NULL比较'吗!?!
    • 假设它可以更明确地描述,但重点仍然是您无法通过=与空值进行比较,您需要检查它是否空。
    • @Qirel 完全理解你!非常感谢!
    猜你喜欢
    • 2019-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-16
    • 2014-03-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多