我有一个包含44列和700行的SQLite数据库。我创建了一个带有Java的用户界面(我有两个textFields和一个Button)来搜索第一个textField中具有特定值的所有列,并使用第二个textField中的另一个值更新它。
问题是我不知道哪个列在第一个textField中输入了值,这就是为什么我不能直接使用"Update table_name SET column_name ..."
语句。
我尝试的是什么;
"Select * FROM table_name WHERE '%" + TextField.getText() + "%';
但它没有用。 你能帮我建立正确的查询吗?
答案 0 :(得分:0)
您可以将FTS表视为CL提到的,但另一种方法是创建一种更简单的方法来查询每一列。您将创建一个函数来遍历每一列以生成其where子句,并使用OR将它们连接在一起。自动执行此操作并保存写入所有44个列名称的一种方法是在数据库中查询所有列名称,并稍后将其用于查询。
public String columnsLike(String like, String... cols) {
return columnsLike(like, Arrays.asList(cols));
}
public String columnsLike(String like, List<String> cols) {
List<String> where = new ArrayList<>();
for(String column : cols) {
where.add(column+" LIKE '"+like+"'");
}
return where.stream().collect(Collectors.joining(" OR "));
}
public List<String> getColumns(String table) {
ResultSet rs = statement.executeQuery("SELECT * FROM "+table);
ResultSetMetaData rsmd = rs.getMetaData();
List<String> columns = new ArrayList<String>();
for (int i = 1; i < rsmd.getColumnCount(); ++i) { columns.add(rsmd.getColumnName(i)); }
return columns;
}
String query = "SELECT * FROM table_name WHERE "+columnsLike('%'+textField.getText()+'%', "column1", "column2", "column3", "column4", "column5");
// Result:
// SELECT * FROM table_name WHERE column1 LIKE '%hello%' OR column2 LIKE '%hello%' OR column3 LIKE '%hello%' OR column4 LIKE '%hello%' OR column5 LIKE '%hello%'
// However you could save time from writing out every column and load them once into an array.
List<String> columns = getColumns("table_name");
// Then call columnsLike('%'+textField.getText()+'%', columns);
要更新与select查询匹配的行中的值,您必须遍历ResultSet行并再次检查它们以更新该特定列。但是,由于我不知道您的所有列是否都是字符串我使用的是getObject()
而不是getString()
,但如果您的所有列都是字符串,则可以更改它。此外,在不知道数据的情况下,多列可以匹配,因此这将更新与找到的匹配项数量。
public void updateColumns(String tableName, List<String> cols, ResultSet rs, String like, String newValue) {
PreparedStatement ps = conn.prepareStatement("UPDATE "+tableName+" SET "+column+" = ? WHERE "+column+" = ? ");
while(rs.next()) {
for(String column : cols) {
String value;
if((value = rs.getObject(column).toString()).matches(".*"+like+".*")) {
ps.setString(1, newValue);
ps.setString(2, value);
ps.addBatch();
}
}
}
ps.executeBatch();
ps.close();
// rs.close();
}
// updateColumns("table_name", columns, resultSet, textField.getText(), textField2.getText());