TSQL - Используйте полученный избранный столбец в операторе Where

Есть ли путь в 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").

11
задан Greg 19 January 2010 в 20:08
поделиться

5 ответов

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
21
ответ дан 3 December 2019 в 02:19
поделиться

Это хорошее место для использования 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 
5
ответ дан 3 December 2019 в 02:19
поделиться

Для 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 
3
ответ дан 3 December 2019 в 02:19
поделиться

Сделайте свой запрос на запрос на запрос и выберите от него, где d = 6. Насколько я знаю, нет способа ссылаться на полученный столбец в том же запросе.

2
ответ дан 3 December 2019 в 02:19
поделиться

Я собираюсь согласиться с Alexkuznetsov на этом, но я также добавил, что если ваш запрос (независимо от того, насколько более сложным) ограничивает в , где Случаи, которые существуют в деле , то эти случай никогда не будут возвращены и не должны быть выбраны в первую очередь.

Например, вы устанавливаете D на «6», где A является «2», а затем ограничивает на , где d = 6 , так что вы Вместо этого можно сделать:

SELECT a,b,c,
    6 AS d
FROM some_table
WHERE a = 2

Это вернет те же результаты в более оптимизированной и чистой моде. Вот почему, ИМХО, нет смысла иметь возможность ссылаться на полученную колонку.

2
ответ дан 3 December 2019 в 02:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: