SQL - это декларативный язык, а не императивный. Порядок выполнения не определен, и это не всегда одно и то же.
В любом случае, порядок исполнения не имеет особого значения. Основной момент заключается в том, что область область - и pricerange
не находится в области действия внутри этого оператора select. Вместо того, чтобы думать о порядке, в котором появляются строки кода (как в императивном программировании), вы должны подумать о том, как каждое выражение обертывает другое выражение.
В этом случае, вы делаете что-то вроде этого:
Select(OrderBy(From(Products), ...), ...)
У вас есть два пути вокруг этого - один вариант использовать тот же самый случай, в порядке, как тот, который вы используете в избранных (не волнуйтесь, двигатель достаточно умен, чтобы не выполнять работу дважды). Во-вторых, чтобы обернуть ваш запрос в другой запрос, который делает фактический порядок:
select * from
(
SELECT productid,
productname,
unitprice,
CASE
WHEN unitprice < 20.0 THEN 'LOW'
WHEN unitprice < 40.0 THEN 'MEDIUM'
WHEN unitprice >= 40.0 THEN 'HIGH'
END pricerange
FROM Production.Products
)
ORDER BY
CASE
WHEN pricerange < 'LOW' THEN 1
WHEN pricerange < 'MEDIUM' THEN 2
WHEN pricerange >= 'HIGH' THEN 3
END ASC
Но имейте в виду, что вы имеете дело с деревьев выражений здесь, не командует списки. Вы описываете, что хотите, а не , как он собирается выполнить. как - это работа механизма выполнения.
В конце концов, механизм выполнения может выполнить один и тот же план выполнения для обоих вариантов запроса - они не совсем разные; хотя, например, могут быть некоторые угловые случаи вокруг NULL, я не уверен.
Вы уверены, что это действительно работает? Я почти уверен, что это не помогло, хотя некоторые версии SQL Server, возможно, допустили это. Какую версию SQL Server вы используете? В любом случае то, что и когда рассчитывается, не ясны в SQL - это декларативный язык, а не императивный, поэтому порядок выполнения не фиксирован. Механизм выполнения определяет лучший способ выполнения запроса (вы можете включить план выполнения, чтобы проверить его). – Luaan
@ Luaan это не работает, вот почему я его спросил :) – ProgrammerAtWork
Может быть, имя столбца 'pricerange' неоднозначно? Возможно, в таблице 'Products' уже есть столбец' pricerange'? – Luaan