是否可以将表本身的属性名称作为mysql中的字符串传递?

时间:2014-11-21 15:46:49

标签: java mysql

我有一个包含属性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的位置。

2 个答案:

答案 0 :(得分:1)

不,这是不可能的:表名和表属性都不能作为参数值传递。如果使用?=?运行代码,JDBC将指示RDBMS比较两个值("name"+iuname)以获得结果。

在这种情况下,您需要动态生成查询。假设属性名称已正确清理,这很好。

替代方案可以是涵盖所有十列的语句,如下所示:

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);