MySQL от 5 до 8 запросов миграции (переписать) - переменные в выражениях - PullRequest
1 голос
/ 23 марта 2019

У меня есть запрос MySQL 5, который генерирует желаемый вывод, но с предупреждениями на MySQL 8.

У меня есть запрос с переменными:

DROP TABLE IF EXISTS test;

CREATE TABLE test
( 
 id SERIAL PRIMARY KEY
 , percent DECIMAL(5,2) NOT NULL
);

INSERT INTO test (percent) VALUES 
(-0.50)
,(0.50)
,(1.00)
,(-0.20)
,(0.50)
,(-1.0)
,(-2.0)
,(0.75)
,(1.0)
,(0.50)
;

SELECT 
    percent,

    CASE @i 
        WHEN 0 THEN ROUND(@i:=(@i+(percent * 1)),2) -1
        ELSE ROUND(@i:=(@i+(percent * ABS(@i))) ,2) -1
    END total_percent

FROM 
    test
    , (SELECT @i:=1) vars         
ORDER 
    BY id; 

Является одним из ответов на этот вопрос
и выдает желаемый результат:

+---------+---------------+
| percent | total_percent |
+---------+---------------+
|   -0.50 |         -0.50 |
|    0.50 |         -0.25 |
|    1.00 |          0.50 |
|   -0.20 |          0.20 |
|    0.50 |          0.80 |
|   -1.00 |         -1.00 |
|   -2.00 |         -3.00 |
|    0.75 |         -1.50 |
|    1.00 |         -1.00 |
|    0.50 |         -0.50 |
+---------+---------------+
10 rows in set, 3 warnings (0.00 sec)

, но с 3 предупреждениями:

Предупреждение |1287 |Установка пользовательских переменных в выражениях устарела и будет удалена в следующем выпуске.Рассмотрим альтернативы: 'SET variable = expression, ...' или 'SELECT expression (s) INTO variable (s)'.

Как использовать:

альтернативы: 'SET variable = expression, ...' или 'SELECT expression (s) INTO variable (s)'.

и измените этот запрос, чтобы он не генерировал предупреждения на MySQL8?

Существует ли какое-либо общее руководство или набор рекомендаций / примеров о том, как правильно переписать запрос из MySQL5 в MySQL8, чтобы не было предупреждений о MySQL8?

Я ожидаю, что в целом из MySQL 5 дляПеременные MySQL 8 - не единственные, которые нужно переписать, ну и что еще?

Обратите внимание, что вопрос не в использовании CTE, а в перезаписи использования переменных из MySQL 5 в запрос MySQL 8, который не приводит кЛюбое предупреждение или ошибка.

Также этот вопрос касается исключительно получения ожидаемого результата на сервере БД, идеально всего с одним запросом (если возможно)

1 Ответ

0 голосов
/ 01 апреля 2019

Альтернативы:

  1. Используйте CTE, как показано в ответах на предыдущий вопрос.
  2. Получите все результаты в ваше приложение и вычисляйте значения постепенно, используя код, а не SQL.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...