在连接之前检查数字是否已经在字段中?

时间:2014-04-10 07:48:51

标签: java mysql

我正在编写一个扫描程序来扫描许多网址,然后将每个网页中找到的所有单词放入表格中。在同一个表中,存储了网址的ID。如果在另一页中重复该单词,则找到该单词的网址的ID与用它们分隔的逗号连接。因此,如果一个单词出现在多个页面上,则该字段中所有连接的ID数字可能如下所示:

2,3,6,8,9

目前,如果该号码在同一页面上多次出现,则每次找到该号码时都会添加ID号码,以便URLID字段可能最终显示为:

2,2,2,4,7,8,8,8,8,8,9,9

使用Java是否有一种方法可以检查字段中是否存在该数字,只有在它已经存在的情况下才添加它?我已经浏览了api,但似乎找不到合适的方法来做到这一点。有什么想法吗?


另外:

public void updateWordTable( String[] array, int urlid ) throws SQLException, IOException {
    Statement stat = connection.createStatement();
    String wordQuery;
    String query;


    for (String item : array) {
        if(item.matches("[A-Za-z0-9]+")){
            wordQuery = "SELECT * FROM word WHERE word = '"+item+"'";
            ResultSet rs = stat.executeQuery(wordQuery);
            if(!rs.next()){
                query = "INSERT INTO word VALUES ('"+item+"',"+urlid+")";
                stat.executeUpdate( query );
            }
            else {
                //query = "UPDATE word SET urlid = concat(urlid, ',"+urlid+"') WHERE word = '"+item+"' ";
                //query = "UPDATE word SET urlid = CASE WHEN FIND_IN_SET( '"+urlid+"', urlid ) > 0 THEN urlid ELSE CONCAT( urlid, ',', '"+urlid+"' )END WHERE word = '"+item+"' ";

                String query2 = "UPDATE word SET urlid = CASE WHEN FIND_IN_SET( ?, urlid ) > 0 THEN urlid ELSE CONCAT( urlid, ',', ? )END WHERE word = ? ";

                PreparedStatement pst = connection.prepareStatement( query2 );

                pst.setLong( 1, urlid );
                pst.setLong( 2, urlid );
                pst.setString( 3, item);

                int result = pst.executeUpdate();

                //stat.executeUpdate( query2 );
            }
        }
    }

    stat.close();
}

6 个答案:

答案 0 :(得分:0)

我猜你的值存储在mysql中,因为你的问题被标记为mysql。在java中,您可以使用select请求数据库,并检查该值是否已插入。

或者,如果您不在mysql世界中但只有java,请使用一个结构,让您作为Set而不是List的单一隐私权。

答案 1 :(得分:0)

最简单的方法就是将这些值加载到Set中。 Set将采用case仅具有唯一元素。 这个想法是每当你存储你的ID时,这个结构应该保持唯一性。当我们谈论Java时,Set是最好的。 如果你想在数据库上有一些机制来提供另一个故事的独特性 这只是一般提示。

答案 2 :(得分:0)

如果您的字段是字符串,那么您可以使用正则表达式

    boolean exists = s.matches("(^|.*,)"+ n + "($|,.*)");

答案 3 :(得分:0)

步骤1:将新url_id存储在临时变量中。

Step2:现在通过select语句检查你的表中是否存在这个url_id,你可以通过下面的查询来做到这一点,假设新的url_id是7:

SELECT COUNT(url_id) FROM mytable WHERE (url_id LIKE '7,%' OR url_id LIKE '%,7' OR url_id LIKE '%,7,%');

步骤3:如果您从上述查询中获得任何计数,请将其保留,否则请添加到您的表格中。

答案 4 :(得分:0)

  

...我有没有办法检查字段中是否存在该号码,只有在它已经存在的情况下才添加它?

您可以使用JAVA进行此操作,但将检查留给MySQL,因为它具有此类搜索功能。

使用MySQL,您可以对列中的逗号分隔值使用FIND_IN_SET函数。这将解决您的问题,不在JAVA中重新处理以查找是否存在此ID。

select 
  FIND_IN_SET( value_to_find, column_with_cs_values ) > 0 as bool_matched
from table_name

如果需要,添加where条件和其他条件。

在JAVA代码中,您只需阅读getBoolean的结果集即可。

boolean idMatched = rs.getBoolean( "bool_matched" );

if( idMatched ) {
  // dont update table
}
else {
  // update table
} 

或者,您可以直接update表格列。

示例

UPDATE table_name
  SET column_name_with_cs_values = 
        CASE WHEN FIND_IN_SET( value_to_find, 
                               column_name_with_cs_values 
                  ) > 0 THEN column_name_with_cs_values 
             ELSE CONCAT( column_name_with_cs_values, ',', value_to_find )
        END
-- add where etc here
;

在JAVA中,您可以像PreparedStatement一样使用上述查询。

String query = "UPDATE word 
                SET urlid = CASE WHEN FIND_IN_SET( ?, urlid ) > 0 THEN urlid 
                            ELSE CONCAT( urlid, ',', ? )
                            END 
                WHERE word = ? ";

PreparedStatement pst = con.prepareStatement( query );

pst.setString( 1, urlid );
pst.setString( 2, urlid );
pst.setString( 3, item);

int result = pst.executeUpdate();

答案 5 :(得分:0)

我在pl / sql中编写了一个像你这样的案例。我的变量存储在一个String中,我必须检查该数字是否已经在String变量中。我是通过使用

完成的
   IF instr('2,3,6,8,9,' '2,') <= 0 THEN
     ' Code to append the '2,'
   End If

对于JAVA,有一些类似于instr方法的字符串String.indexOf()

http://www.tutorialspoint.com/java/java_string_indexof.htm

但请注意,如果它是第一个字符,它将返回0,因此它可能会&lt; 0

String a = "2,3,6,8,9,";
If a.indexOf(ID + ",") < 0 { // -1 equivalent to NOT FOUND
    // code to append ID + ","; 
}

注意我需要查看ID +&#34;,&#34;原因是例如。

ID = "2";
a = "20,3,6,8,9,";

由于20,它将返回0。因此,我使用逗号作为找到的每个数字的分隔符。

所以在我完成追加变量a之后,我会删除最后一个逗号

a = a.substring(0, a.length()-1); // this will remove the last ","
System.out.println(a); // the output should be - 2,3,6,8,9

如果您的变量存储在Java中,则使用Java。