Я хочу спросить кое-что о повторном использовании псевдонима.
У меня есть такой пример,
1-й запрос:
select
@tmp1 := if (AA.id= '','abcde','yuiop') as tmp1,
CONCAT_WS('-',
SUBSTR(@tmp1, 1, 2),
SUBSTR(@tmp1, 3, 4),
SUBSTR(@tmp1, 5)
) AS tmp1_res
FROM some_database as AA
2-й запрос:
select
CONCAT_WS('-',
SUBSTR(if (AA.id= '','abcde','yuiop'), 1, 2),
SUBSTR(if (AA.id= '','abcde','yuiop'), 3, 4),
SUBSTR(if (AA.id= '','abcde','yuiop'), 5)
) AS tmp1_res
FROM some_database as AA
Оба запроса работают хорошо, но мне интересно, какой из них более эффективен.
В первом запросе я вижу, что подстрока вызывает только определенную, на мой взгляд, переменную "заполнитель". Я предполагаю, что он не будет сначала проверять AA.id 3 раза, а затем разделять их, что, я думаю, будет более эффективным. Это верно ?
Спасибо
РЕДАКТИРОВАТЬ
Спасибо за ответы. Я только что протестировал оба метода, оказалось, что второй метод немного быстрее (примерно 0,001 ~ 0,004 секунды), чем первый.
еще одна вещь, которую я действительно не понимаю, что касается 1-го запроса, такое же поведение, как и 2-й запрос, или нет? (насколько я понимаю, второй запрос проверяет столбец id по условию if каждый раз, когда используется функция вычитания, а первый только один раз выполняет условие if)
SQL-запросы не выполняются точно так же, как вы их пишете. Оптимизаторы запросов обрабатывают общие элементы запроса как единицы, а затем повторно используют эти единицы по своему усмотрению. Вы можете обнаружить, что план объяснения (выполнения) точно такой же. Кстати, здесь вы имеете дело не с псевдонимами столбцов, а с использованием переменных вместо функций if.
Я сомневаюсь, что вы заметите другое, если не выполните это миллиард раз. Выбирайте все, что вам кажется наиболее читаемым. В первом проще вносить изменения всего в одном месте, во втором проще. Вам решать.






Глядя на план выполнения, можно узнать, есть ли между ними существенная разница.