【问题标题】:How to pass in variable in over clause如何在over子句中传递变量
【发布时间】:2020-01-24 00:40:57
【问题描述】:

我正在尝试将变量传递给 over 子句。

最初,我将其硬编码为 over (partition by deviceid order by readdate rows between current row and 2 following)

有没有办法做类似的事情 over (partition by deviceid order by readdate rows between current row and continuousexcessivehours following)

或类似的东西 over (partition by deviceid order by readdate rows between current row and ISNULL(continuousexcessivehours, 2) following)

我得到的错误:错误:Amazon Invalid operation:在“continuousexcessivehours”或附近出现语法错误

感谢您的帮助。

【问题讨论】:

  • 这可能取决于数据库。用您正在使用的数据库标记您的问题。而且,当你尝试这个时会发生什么?
  • @GordonLinoff 添加了我遇到的数据库。它仅在我尝试传入变量时发生。如果我通过 2,它工作正常。几乎就像它必须是一个静态数字一样?

标签: sql amazon-redshift window-functions


【解决方案1】:

某些执行参数化 SQL 语句的技术允许在 SQL 语句中的某些特定点使用参数。

例如,DB2 不允许参数限制返回的行数:而这个参数化的 JDBC 语句是有效的:

select * from t where status = ? order by amount fetch first 10 rows only

...这个不是:

select * from t where status = ? order by amount fetch first ? rows only

我的猜测是您面临着类似的引擎或驱动程序限制。

到目前为止,我发现的最佳解决方法是将有问题的参数注入作为字符串,将其连接到 SQL 语句。例如,在 Java 中你可以这样做:

// parameters

int status = 3;
int maxRows = 10;

// execution

PreparedStatement ps = conn.prepareStatement(
  "select * from t where status = ? order by amount fetch first " 
  + maxRows
  + " rows only"
);
ps.setInt(1, status);
ResultSet rs = ps.executeQuery();

这两个参数都使用了,但方式不同:

  1. status 包含在传统的 JDBC 参数中。
  2. maxRows 作为纯字符串注入(SQL 注入)。

在您的情况下,您可以对参数continuousexcessivehours 使用第二种策略。

许多 ORM 提供解决方案来实现这一点。例如,MyBatis 为第一种情况提供#{status},为第二种情况提供${maxRows}。你发现区别了吗?

最后,最后一句忠告:小心 SQL 注入。仅当您确定知道参数值的来源并且它不是来自未知来源时,才对参数执行字符串注入。

【讨论】:

  • 我最初是这样的,以为会有一种方法可以使用来自不同表的值。我会打针。谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-18
  • 2017-05-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-06-29
相关资源
最近更新 更多