我有一个包含属性id和name1,name2,name3 ..... name10的表,其中所有这十个名称都属于id。
id name1 name2 name3 name4 name5 name6 name7 name8 name9 name10
201 ijk lmn xyz abc efg hks dkm jjl dkn awt
202 mjl pan van slm tko kds jar slk dkf asd
现在我需要检索id,无论遇到10个名字中的名字。如果它是一个print语句,通过保持字符串“name”不变来使用循环来增加数字是非常容易的。但是在使用mysql语句时该怎么做呢?首先,甚至可以将属性名称作为字符串传递?
例如:当传递字符串为where condition时,
String uname=jf1.getText();
PreparedStatement stmt=conn.prepareStatement("Select * from staff where id = ?");
stmt.setString(1,uname);
ResultSet rs=stmt.executeQuery();
rs.next();
但是当我需要检查从name1到name10的所有属性时,它可以是这样的吗?
String uname=jf1.getText();
PreparedStatement stmt=conn.prepareStatement("Select id from staff where ?=?");
for(int i=1;i<=10<i++)
stmt.setString(1,"name"+i);
stmt.setString(2,uname);
用户通过文本字段给出uname的位置。
答案 0 :(得分:1)
不,这是不可能的:表名和表属性都不能作为参数值传递。如果使用?=?
运行代码,JDBC将指示RDBMS比较两个值("name"+i
和uname
)以获得结果。
在这种情况下,您需要动态生成查询。假设属性名称已正确清理,这很好。
替代方案可以是涵盖所有十列的语句,如下所示:
PreparedStatement stmt=conn.prepareStatement(
"select * from staff where ? = case ? when 1 then name1 when 2 then name2 when 3 then name3 ... else null end"
);
现在,您可以将值绑定到第一个参数,将name#
列的数量绑定到第二个参数。
答案 1 :(得分:1)
使用IN会不会更容易!
SELECT
id
FROM
staff
WHERE
? IN (name1, name2, name3, name4, name5,
name6, name7, name8, name9, name10);