【问题标题】:How to determine if a table contains a value in SQL?如何确定一个表是否包含 SQL 中的值?
【发布时间】:2014-01-16 00:07:18
【问题描述】:

我觉得我在这里遗漏了一些非常明显的东西,但似乎这样做的唯一方法是获取值,然后查看它是否返回 null(空)值,我宁愿这样做不做。

SQL 中是否有与 List.contains(Object o) 等价的方法?或者也许 JDBC 具有这种性质?如果有,是什么?

我正在使用 Microsoft Access 2013。

不幸的是,我没有任何有用的代码可以展示,但这里是我想要做的事情的要点。它根本不是什么独特的东西。我想要一个方法(Java),它返回存储在数据库中的用户值。如果用户之前没有添加到数据库中,则应该添加用户,并且应该设置用户的默认值。然后将返回那些新创建的值。如果一个玩家已经被添加到数据库中(以用户名作为主键),我不想覆盖已经存在的数据。


我也建议不要为此使用 MS Access,但如果您熟悉 MS Office 应用程序,熟悉的 UI/UX 结构可能会帮助您站稳脚跟,并且需要更少的时间来学习其他数据库环境。但是,MS Access 往往非常有限,如果可用,我建议考虑其他选项。

【问题讨论】:

  • SELECT 1 FROM <table> WHERE <column> = <value> LIMIT 1; 有什么问题?
  • 我想这没什么问题。我对 SQL 很陌生,而且我已经习惯了那些具有处理该操作的预先存在的函数的类型,例如 List.contains(Object o)。我总是可以在 Java 中创建自己的方法来为我执行该操作。我总是喜欢尽可能地限制重复代码,而且我会经常使用它。
  • 你能描述一下你想让代码做什么吗?假设你有一个查询,查询应该返回什么?
  • 我是 SQL 新手,我想做的事情并不是独一无二的。如果以前从未使用过我的应用程序的人尝试使用数据库,则应该添加他们,并以他们的用户名作为主键。如果它们已被添加,则代码不应再次尝试将它们添加到数据库中。
  • 在 JDBC 中,您应该绝对PreparedStatement 与静态 SQL 一起使用,而不是使用来自用户的字符串来评估某些内容。否则你可能会让 sql-injection 的恶魔进来……

标签: java sql ms-access jdbc ms-access-2013


【解决方案1】:

我创建了以下方法,据我所知,它非常有效。 (使用 java.sql 包)

public static containsUser(String username)
{
    //connection is the Connection object used to connect to my Access database.
    Statement statement = this.connection.createStatement();
    //"Users" is the name of the table, "Username" is the primary key.
    String sql = "SELECT * FROM Users WHERE Username = '" + username + "'";
    Result result = statement.executeQuery(sql);
    //There is no need for a loop because the primary key is unique.
    return result.next();
}

这是一种非常简单且非常基本的方法,但希望它可以在将来对某人有所帮助。 如果有什么问题,请告诉我。我不希望任何人学习或使用写得不好的代码。

重要编辑:在我写完上述内容(包括问题和答案)之后,现在已经过去了五年多,我现在建议反对我上面说明的解决方案。

虽然它确实有效,但它优先考虑使用“Java 思维友好”的 SQL 方法。简而言之,将一种语言的范式和思维方式迁移到另一种语言通常是一个坏主意,因为您最终会不可避免地发现自己试图将方形钉子放入圆孔中。完成这项工作的唯一方法是将正方形的角剃掉。然后钉子当然会合适,但正如您可以想象的那样,首先从圆形钉子开始会是更好、更清洁且不那么混乱的解决方案。

相反,请参阅上述赞成的答案,以获得更现实、对企业友好的解决方案来解决这个问题,尤其是当我认为阅读这篇文章的人可能与我最初写这篇文章时的情况相似。

【讨论】:

  • 我没有得到你的回报。特别是,我没有得到没有返回类型的方法签名。
  • 你为什么选择 * 到内存中只是为了看看是否存在
【解决方案2】:

我也是 sql 新手,我正在使用 Oracle。

在 Oracle 中,假设我们有:TYPE: value。

我们可以使用:

where value not in (select TYPE from table)

确保value不存在于表的TYPE列中。

不知道有没有用。

【讨论】:

    【解决方案3】:

    您可以使用“IF EXISTS”返回boolean10

    select
      if(
        exists( select * from date1 where current_date()>now() ),
        'today > now',
        'today is not > now' 
      ) as 'today > now ?' ;
    
    +--------------------+
    | today > now?       |
    +--------------------+
    | today is not > now |
    +--------------------+
    1 row in set (0.00 sec)
    

    另一个例子

    SELECT IF( 
             EXISTS( SELECT col from tbl where id='n' ),
             colX, colY 
           ) AS 'result'
    FROM TBL;
    

    【讨论】:

    • 如果这是一个愚蠢的问题,我很抱歉,但是我将如何使用 JDBC 来做到这一点?
    • @TacoManStan:检查我的另一个示例
    【解决方案4】:

    您可以简单地使用带条件的查询。

    例如,如果您必须检查具有特定列的记录,您可以使用where 条件

    select * from table where column1 = 'checkvalue'
    

    您可以使用count 属性来检查编号。在您指定的条件下存在的记录数

    select count(*) from table where column1 = 'checkvalue'
    

    【讨论】:

      【解决方案5】:

      查看 SQL 表中是否包含具有某列条件的行的唯一方法是实际进行 SQL 查询。我不明白你为什么不这样做。只需确保在要约束结果的列上有一个索引。此外,为了提高速度,请使用 count 以防止从行中检索所有数据。

      SELECT count(*) FROM foos WHERE bar = 'baz'
      

      假设您在 bar 列上有一个索引,这个查询应该很快,您所要做的就是检查它是否返回 > 0。如果是,那么您有符合您条件的行。

      【讨论】:

        猜你喜欢
        • 2012-09-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-02-14
        相关资源
        最近更新 更多