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
実際のcaseステートメントは非常に複雑なので、where句で繰り返さないようにしていますか?これを行うためのトリックはありますか?
(MySQLには「havingd = 6」を使用するためのトリックがあると思います)。
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
実際のcaseステートメントは非常に複雑なので、where句で繰り返さないようにしていますか?これを行うためのトリックはありますか?
(MySQLには「havingd = 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
別のオプションは、case
ステートメントを関数として実装することです。変換や計算の問題に特に適しています。関数の優れている点は、「ビジネス」ロジックが 1 つの場所にあり、他のクエリで簡単に再利用できることです。
-- 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に同意しますが、クエリが (どんなに複雑であっても)WHERE
に存在する句のケースを制限している場合CASE
、それらCASE
の s は決して返されず、返されるべきではないことも付け加えておきます。そもそも選ばれない。
たとえば、 を'2' としてd
'6' に設定しa
、次に に制限してWHERE d = 6
いるので、代わりに次のようにすることができます。
SELECT a,b,c,
6 AS d
FROM some_table
WHERE a = 2
これにより、より最適化されたクリーンな方法で同じ結果が返されます。これが、私見ですが、派生列を参照できることに意味がない理由です。
これに代わる方法は、次を使用することCROSS APPLY
です。
select a,b,c,
from some_table
CROSS APPLY (SELECT case
when a=1 then 5
when a=2 then 6
end) CxA(d)
where d=6