0

以下のように、クエリで使用する変数 age があります。

Declare @age as int 11

Select * from people p where p.age = @age

しかし、@age に 0 を付けたときに 10 歳から 13 歳までのすべての人を表示したいので、次のようにしようとしています。

Select * 
from people p 
where p.age in( case 
                     when @age = 0 
                          then 10, 11, 12, 13
                          else @age
                     end
              )

誰か私に光をくれませんか?

4

5 に答える 5

3

ステートメントは必要ありません。句をCASE少し変えるだけでかまいません。WHEREこれは同じ結果を返すはずです:

Select * 
from people p 
where 
( 
    @age = 0 
    AND p.age IN (10, 11, 12, 13)
)
OR
(
    @age != 0 
    AND p.age = @age
)
于 2012-08-13T19:54:07.080 に答える
3

case ステートメントは必要ありません。

SELECT col1, col2, ..., coln
FROM people AS p 
WHERE (@age = 0 AND p.age BETWEEN 10 AND 13)
OR (@age <> 0 AND p.age = @age)
于 2012-08-13T19:54:11.717 に答える
1

これが一番簡単そうです

また、ビジネス ルールが変更された場合の修正も容易です。

declare @min int
declare @max int
declare @age int

set @age = 0

if (@age = 0)
begin
   SET @min = 10
   SET @max = 13
end
else
begin
   SET @min = @age
   SET @max = @age
end 

Select * 
from people p 
where age >= @min and age <= @max
于 2012-08-13T19:54:01.123 に答える
0
select *
from people
where (age between 10 and 13 and @age=0) 
or (age = @age)
于 2012-08-13T19:51:39.110 に答える
-2

IN()部分にSELECTを追加する必要があります

Select * 
from people p 
where p.age in (SELECT case 
                     when @age = 0 
                          then 10, 11, 12, 13
                          else @age
                     end
              )
于 2012-08-13T20:04:31.320 に答える