如何检查数据库中的一列是否有空值

8mmmxcuj  于 2021-06-24  发布在  Mysql
关注(0)|答案(1)|浏览(587)

我在数据库中有一个表应用程序,其中有一些列命名为leaveid、leavetype、nofdays和其他许多列。q是所选textfield选项的逻辑名称。如果某个用户在 nofdays 那我怎么确定呢?我正在使用它,但它不起作用:

String q = request.getParameter("q");
ResultSet r = smt.executeQuery(
    "select leaveid ,leavetype,sum(nofdays) as nofdays from application where (name= '"
        + session.getAttribute("userid") + "' and leavetype='" + q
        + "') group by leavetype" );

while (r.next()) {
    nofdays = r.getInt("nofdays");
    if (nofdays == 0) {
        if (q.equals("SL")) {
            balleave = 12 - nofdays;
            out.print(balleave);
        }
    }

我想得到(balleave=12)中的值。我怎样才能做到这一点?

2mbi3lxu

2mbi3lxu1#

有点不清楚您在问什么,但我认为您正在努力解决的问题是,您的表中不包含具有所选用户id和 leavetype “sr”。在这种情况下,您似乎需要计算 balleave 12岁。假设我正确地解释了您,那么您的方法和特定代码都存在一些问题。
这种方法最基本的问题是,查询不返回与要检测的条件对应的任何行。这是很自然的,因为像yours这样的聚合查询只聚合现有数据。解决这个问题最简单的方法可能是在没有显示其他结果的情况下设置一个默认值(即12)。
现在,对于您描述的任务,您的查询和java代码过于复杂,我倾向于认为您选择的结构有更大的原因。然而,既然你还没有披露这样一件事,我就不能建议如何将工作方法融入其中。相反,这里有一个独立的版本:

int balleave = 12;  // This value will stick if there is no data
String q = request.getParameter("q");

if ("SR".equals(q)) {
    PreparedStatement stmt = connection.prepareStatement(
        "select sum(nofdays) as nofdays from application where name = ? and leavetype= 'SR'");

    try {
        stmt.setString(1, session.getAttribute("userid"));

        ResultSet r = stmt.executeQuery();

        try {
            if (r.next()) {
                balleave -= r.getInt("nofdays");
            }
        } finally {
            r.close();
        }
    } finally {
        stmt.close();
    }
}

注意,不需要循环,因为结果集最多包含一行。您的原始代码也是如此。还要注意的是,通过将输入值与字符串文字连接起来来构造sql语句是非常不安全的。如果要执行由变量输入值参数化的语句,请使用 PreparedStatement . 尤其是当从用户输入中提取任何参数时。
另外,你正在设置 balleave 只有在用户指定 q 作为“sr”。如果这是唯一的目标,那么当用户指定其他值时,您根本不需要执行任何查询 q --在这种情况下,你事先就知道你不会得到一个符合目的的结果。

相关问题