Есть ли путь в TSQL, чтобы сделать что-то вроде этого:
select a,b,c,
case
when a=1 then 5
when a=2 then 6
end as d
from some_table
where d=6
Фактический оператор выбора действительно сложен, таким образом, я стараюсь не повторять его в где пункт? Там какие-либо приемы должны сделать это?
(Я думаю, что существует прием в MySQL для использования "наличия d=6").
select
a, b, c
from (
select
a, b, c,
case
when a=1 then 5
when a=2 then 6
end as d
from some_table
) as t
where d=6
Это хорошее место для использования CTE , например:
WITH MassagedData (a, b, c, d) AS
(
select a, b, c,
case
when a=1 then 5
when a=2 then 6
end as d
from some_table
)
SELECT a,b,c
FROM MassagedData
where d=6
Для N выбора K можно использовать треугольник Паскалей. В основном вам нужно сохранить массив размера N вокруг, чтобы вычислить все N выбрать K значений. Потребуются только добавления.
-121--1302500-Я использую их для нескольких опций выбора, таким образом, я храню только одно значение вместо 10 или более
-121--604502- Другим вариантом является реализация оператора case
в качестве функции. Особенно хорошо при преобразовании или вычислениях. Что приятно в функциях, так это то, что «бизнес» логика находится в одном месте и может легко использоваться в других запросах.
-- sample code not tested
CREATE FUNCTION dbo.fn_MyConvertA(
-- Add the parameters for the function here
@a int
)
RETURNS int -- for example
AS
BEGIN
-- Declare the return variable here
DECLARE @ResultVar as int
-- Add the T-SQL statements to compute the return value here
set @ResultVar = case when @a = 1 then 5 when @a = 2 then 6 else 10 end
-- Return the result of the function
RETURN @ResultVar
END
GO
-- now you case write your query
select a,b,c, dbo.fn_MyConvertA(a) as d
from some_table
where dbo.fn_MyConvertA(a)=6
Сделайте свой запрос на запрос на запрос и выберите от него, где d = 6. Насколько я знаю, нет способа ссылаться на полученный столбец в том же запросе.
Я собираюсь согласиться с Alexkuznetsov на этом, но я также добавил, что если ваш запрос (независимо от того, насколько более сложным) ограничивает в , где
Случаи, которые существуют в деле
, то эти случай
никогда не будут возвращены и не должны быть выбраны в первую очередь.
Например, вы устанавливаете D
на «6», где A
является «2», а затем ограничивает на , где d = 6
, так что вы Вместо этого можно сделать:
SELECT a,b,c,
6 AS d
FROM some_table
WHERE a = 2
Это вернет те же результаты в более оптимизированной и чистой моде. Вот почему, ИМХО, нет смысла иметь возможность ссылаться на полученную колонку.