Как установить новое значение переменной в запросе с UNION во второй его части

Рейтинг: 0Ответов: 0Опубликовано: 01.08.2023

Есть View (к сожалению не могу показать - громоздкий код и нельзя разглашать) Вот его часть:

CREATE VIEW MyView AS
  SELECT *
  FROM tabl
  WHERE date BETWEEN
  ...
  ORDER BY
    (CASE MyFunction() WHEN 'DESC'  THEN date END) DESC,
    (CASE MyFunction() WHEN 'ASC' THEN date END) ASC

Делаю немного странную вещь (об этом еще српошу) - опрашиваю функцию MyFunction() и по значению меняю сортировку.

Теперь код функции:

CREATE FUNCTION MyFunction() returns TEXT NO SQL  DETERMINISTIC
return @Val;

Тут всего лишь возвращается некая переменная. Детерминированная.

И вот главный запрос с Union и переменными:

select * , Min(MyView.date) as `start`, Max(MyView.date) as `end`, sum(MyView.count) as `count`
from (select  @Val := 'ASC') _ ,MyView
left join tabl t on (t.count = MyView.count) and (t.id = MyView.id)
UNION ALL
select *,Min(MyView.date) as `start`, Max(MyView.date) as `end`, sum(MyView.count) as `count`
from (select  @Val := 'DESC') _, MyView
left join tabl t on (t.count = MyView.count) and (t.id = MyView.id)

Пояснение:

  • Запросы отличаются только направлением сортировки DESC / ASC
  • Перед использованием View, во FROM блоке, переменной назначается новое значение (select @Val := 'ASC')
  • если запросы разъединить, направления ORDER BY работают как надо.
  • функция нужна для того, что бы хакнуть View, он ведь не может принимать параметры (см хак тут https://stackoverflow.com/a/5331792/5474389)
  • база - MariaDB

Не работает часть

from (select @Val := 'ASC')

в первом запросе. ASC не проходит во View. В результате получается 2 одинаковых запроса, как если бы передается все время 'DESC'

Что пробовал:

  1. использовать select SQL_NO_CACHE... Пишет : Incorrect usage/placement of 'SQL_NO_CACHE'

  2. там по ссылке в комменте предлагали решение: "Необходимо установить @p1 := NULL; в виде отдельного оператора. Или начать новый сеанс, в котором переменная еще не определена." как-то не помогло.

Вопросы:

  1. как все таки в UNION запросе для каждой его части передать разные значения переменной?
  2. Вобще такая схема , чтобы убрать дублирование большого запроса, его вынес в View. Разумно ли так делать, или в SQL лучше не мудрить и прописывать 2 похожих View?

Ответы

Ответов пока нет.