12

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」を使用するためのトリックがあると思います)。

4

6 に答える 6

23
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
于 2010-01-19T20:09:25.150 に答える
7

これは、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 
于 2010-01-19T20:15:01.113 に答える
3

別のオプションは、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 
于 2010-01-19T20:48:13.423 に答える
2

投稿したクエリをサブクエリにして、そこからd = 6を選択します。私が知る限り、同じクエリで派生列を参照する方法はありません。

于 2010-01-19T20:10:28.723 に答える
2

これについては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

これにより、より最適化されたクリーンな方法で同じ結果が返されます。これが、私見ですが、派生列を参照できることに意味がない理由です。

于 2010-01-19T20:17:02.980 に答える
0

これに代わる方法は、次を使用すること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
于 2012-01-27T21:27:59.500 に答える