Как передать переменную в над предложении - PullRequest
1 голос
/ 24 сентября 2019

Я пытаюсь передать переменную в предложение 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 Недопустимая операция: синтаксическая ошибка в или около «continueousexcessivehours»

Спасибо за помощь.

1 Ответ

2 голосов
/ 24 сентября 2019

Некоторые технологии, которые выполняют параметризованные операторы SQL, допускают параметры в определенных точках в операторе SQL ONLY .

Например, 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 Injection).

В вашем случае вы можете использовать вторую стратегию для параметра continuousexcessivehours.

Многие ORM предлагают решения для достижения этой цели.Например, MyBatis предлагает #{status} для первого случая и ${maxRows} для второго.Вы заметили разницу?

Наконец, последний совет: будьте осторожны с SQL-инъекцией.Выполняйте ввод строки только для параметра, если вы уверены, что знаете происхождение его значения, а оно не из неизвестного источника.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...