Повторное использование параметров более одного раза

Пишу отчет в BIRT. У меня есть два входных параметра в моем наборе данных.

Второй параметр я бы хотел использовать дважды в предложении where. Я обнаружил, что могу сделать это, используя предложение with. Обратите внимание, что это база данных postgresql, поэтому мне не нужен from dual.

Мой sql выглядит следующим образом:

with "params" as (select ? as "sname", ? as "ename")
select "user"."fullName", "user"."address1", "user"."address2", "user"."city", "provinces"."abbreviation", "user"."postalcode", "client"."companyName"
from "user", "params"
LEFT JOIN "client" on "user"."client" = "client"."id" 
LEFT JOIN "provinces" on "user"."province" = "provinces"."id"
WHERE "user"."fullName" >= "params"."sname" and (("user"."fullName" <= "params"."ename") or ("params"."ename" =''))`

Когда я пытаюсь запустить это или просмотреть результаты на экране редактирования набора данных BIRT, я получаю следующую ошибку:

Произошла ошибка при выполнении отчета. at .... Причина: org.eclipse.birt.report.data.adapter.api.AdapterException: во время обработки возникло исключение. Подробности см. в следующем сообщении: Не удалось подготовить выполнение запроса для набора данных: пользователь не может получить метаданные результирующего набора. org.eclipse.birt.report.data.oda.jdbc.JDBCException: оператор SQL не возвращает объект ResultSet. Ошибка SQL № 1: ОШИБКА: неверная ссылка на запись FROM для таблицы «пользователь» Подсказка: существует запись для таблицы «пользователь», но на нее нельзя сослаться из этой части запроса. Позиция: 252;

Я не могу пройти мимо этого. Из всего, что я видел, это должно работать.


person farley    schedule 29.03.2016    source источник
comment
Не имеет отношения, но: вы можете сделать CTE еще короче: with params (sname, ename) as (values (?, ?) ) ...   -  person a_horse_with_no_name    schedule 29.03.2016


Ответы (1)


Вы можете добавить несколько параметров в свой SQL-запрос в Birt и повторно использовать входной параметр из Birt столько раз, сколько захотите. Сравните мой ответ на этот вопрос.

Таким образом, вы можете написать свой запрос без with-clause и предотвратить смешивание явных и неявных соединений:

select "user"."fullName", "user"."address1", "user"."address2", "user"."city", "provinces"."abbreviation", "user"."postalcode", "client"."companyName"
from "user"
LEFT JOIN "client" on "user"."client" = "client"."id" 
LEFT JOIN "provinces" on "user"."province" = "provinces"."id"
WHERE "user"."fullName" >= ? and (("user"."fullName" <= ?) or (? =''))
person Simulant    schedule 29.03.2016
comment
Это вроде сработало. Хотя Бирт не улавливал, что моим вторым параметром было = ''. Поэтому я по умолчанию установил для параметра значение null и изменил конец предложения where на: select "user"."fullName", "user"."address1", "user"."address2", "user"."city", "provinces"."abbreviation", "user"."postalcode", "client"."companyName" from "user" LEFT JOIN "client" on "user"."client" = "client"."id" LEFT JOIN "provinces" on "user"."province" = "provinces"."id" WHERE "user"."fullName" >= ? and (("user"."fullName" <= ?) or (? is null)) - person farley; 29.03.2016
comment
Я решил все это сейчас. Спасибо за помощь. Жаль, что я не нашел ваше более раннее решение. - person farley; 29.03.2016