假设我有下一个查询:
SELECT UNIX_TIMESTAMP(Logins.FechaLogin) FROM GA.Logins WHERE Logins.IdEmpleado = ? AND UNIX_TIMESTAMP(Logins.FechaLogin) >= UNIX_TIMESTAMP(?) AND UNIX_TIMESTAMP(Logins.FechaLogin) <= UNIX_TIMESTAMP(?)
我想要的是:
Date = UNIX_TIMESTAMP(Logins.FechaLogin);
SELECT UNIX_TIMESTAMP(Logins.FechaLogin) FROM GA.Logins WHERE Logins.IdEmpleado = ? AND Date >= UNIX_TIMESTAMP(?) AND Date <= UNIX_TIMESTAMP(?)
stmt.setInt(1, EmployeeId);
stmt.setString(2, Date1);
stmt.setString(3, Date2);
全部进入预备语句(JDBC prepareStatement()),有没有办法可以做这样的事情以避免冗余进入查询?或者这是没用的东西?顺便说一下,如果我是正确的话,我认为必须在每次SELECT迭代中传递UNIX_TIMESTAMP函数。
感谢的!
答案 0 :(得分:1)
简短的回答是否定的,您不能引用MySQL变量来代替列引用,也不能代替包含列引用的表达式。在准备好的语句中,您只能将变量“绑定”到值;你不能“绑定”表名或列名。
(此限制与处理SQL语句的方式有关。当SQL语句“准备好”时,优化器需要知道所引用的所有表和列。它必须验证引用是有效的,用户对引用的对象有权限,它必须查找列的数据类型,检查合适的索引,等等。问题是如果缺少列名,它就不能这样做。这就解释了为什么你找不到任何你想做的事情的例子。)
显然,您可以利用Java变量和字符串操作来生成包含将传递给MySQL的SQL文本的String。但传递给MySQL的最终字符串可以有占位符,但那些只能是值的占位符。
那应该回答你的问题。
关于UNIX_TIMESTAMP函数的使用(无论是必要的还是可取的),我们可以做出其他几个注释,包含函数的列引用的谓词的性能影响等等。但那些并没有真正回答这个问题你在问。