【问题标题】:How to check if a row exist in the SQLite table with a condition如何使用条件检查 SQLite 表中是否存在行
【发布时间】:2015-04-15 01:49:48
【问题描述】:

我在我的软件中使用 SQLite 本地数据库。我想根据行的给定值检查行是否存在。例如:"SELECT * FROM ftp WHERE Host LIKE '"+ host +"' AND Username LIKE '"+ username +"' "

但我想得到布尔结果,所以如果找到记录做某事,如果没有做其他事情。我可以这样做吗?

这是我厌倦的,但它总是正确的,因为它检查查询是否运行,而不是它是否返回数据。

public void ftpTableCheck(String host, String port, String username, String password){
    try{
        String query = "SELECT * FROM ftp WHERE Host LIKE '"+ host +"' AND Username LIKE '"+ username +"' ";
        PreparedStatement pst = conn.prepareStatement(query);

        if (pst.execute() == true){
            System.out.println("true");
        }
    }catch(Exception e){
        e.printStackTrace();
    }
}

知道如何解决吗? 谢谢

【问题讨论】:

  • 你可以使用select count(*) ...,它会返回一个包含匹配结果数量的单行...你可以试试select (count(*) > 0) as found ...或其他东西(ps-未测试;))
  • 我用 H2 进行了测试(没有安装 SQLite),select (count(*) > 0) as found ... 为我工作并返回了一个布尔结果
  • 你说得对,它正在工作,即使是 COUNT(*) 也能在任何 SQL 软件中工作并给出正确的值。但在 java 中,我必须通过 ResultSet 获取查询结果,而这个类似乎没有任何方法来显示行数。这就是我要找的

标签: java sql sqlite


【解决方案1】:

因此,您可以使用 select count(*) ...select (count(*) > 0) as found ... 之类的内容作为基本查询。

当你调用executeQuery时,你会得到一个ResultSet作为回报,由此你需要确定它的内容。

在您的情况下,您只需要单行结果,因此您可以简单地使用 ResultSet#next 移动到第一行,然后从中提取列值...

public void ftpTableCheck(String host, String port, String username, String password) {
    try {
        String query = "SELECT (count(*) > 0) as found FROM ftp WHERE Host LIKE ? AND Username LIKE ?";
        PreparedStatement pst = conn.prepareStatement(query);
        pst.setString(1, host);
        pst.setString(2, username);

        try (ResultSet rs = pst.executeQuery()) {
            // Only expecting a single result
            if (rs.next()) {
                boolean found = rs.getBoolean(1); // "found" column
                if (found) {
                    // You have rows
                } else {
                    // You have no rows
                }
            }
        }
    } catch (SQLException e) {
        e.printStackTrace();
    }
}

请仔细查看JDBC Database AccessUsing Prepared Statements 了解更多详情

【讨论】:

  • 这是一个不错的改变。很高兴它可以提供帮助;)
【解决方案2】:

执行此操作的一般方法是获取结果并检查它是否不为空。对于您的问题,计算返回的行数是合乎逻辑的。

正如@MadProgrammer 所说,查询如下:

String query = "SELECT COUNT(*) FROM ftp WHERE Host LIKE '"+ host +"' AND Username LIKE '"+ username +"' ";

现在您只需要获取计数并检查它是 0(未找到)还是不是(已找到)

【讨论】:

  • 谢谢,它似乎在我的 SQL 平台上工作。但是你能说一下如何得到结果来检查它是0还是更多吗?
  • @Dan 我不是 Java 开发人员。但是:获取你的结果为ResultSet rs = pst.executeQuery(query);
  • 也看看这个tutorial
  • 这很危险。易受 SQL 注入攻击。
  • 对,你是@Rafael
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-21
  • 1970-01-01
  • 2011-01-27
  • 1970-01-01
  • 2015-12-21
相关资源
最近更新 更多