我正在编写一个扫描程序来扫描许多网址,然后将每个网页中找到的所有单词放入表格中。在同一个表中,存储了网址的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();
}
答案 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。