0

ストアドプロシージャに渡されたいくつかのパラメータに基づいてデータを選択しようとしています。私は年齢に問題があります、私はこのようなことをしようとしています:

ストアドプロシージャパラメータの場合、15〜18@Age = 1歳、次に19〜25歳を選択します@Age = 2...明らかにこれは正しくありません。誰でも助けることができます。ありがとう。:

SELECT
    User 
FROM
    [Member] m
WHERE 
    ((m.Gender = @Gender) or @Gender IS NULL)
    and ((DATEDIFF(hour,m.DOB,GETDATE())/8766) Between 
       CASE    
         WHEN @Age = 1 THEN (SELECT DATEDIFF(hour, m.DOB, GETDATE())/8766 WHERE (SELECT DATEDIFF(hour, m.DOB, GETDATE())/8766) between 15 and 18)
         WHEN @Age = 2 THEN (SELECT DATEDIFF(hour,m.DOB,GETDATE())/8766 WHERE (SELECT DATEDIFF(hour,m.DOB,GETDATE())/8766) between 19 and 25) 
       END) 
4

1 に答える 1

4

私はこれがあなたが求めているものだと思います(おそらくいくつかの余分な括弧が付いています):

Select 
  [User]
From
  [Member] m
Where (
    (m.Gender = @Gender) or 
    @Gender Is Null
  ) And (
    (@Age = 1 And DateDiff(hour, m.Dob, GetDate())/8766 Between 15 and 18) Or
    (@Age = 2 And DateDiff(hour, m.Dob, GetDate())/8766 Between 19 and 25) 
  ) 

句がたくさんある場合は、次のように読みやすくなる可能性があります(MemberID主キーを想定)

Select
  [User]
From
  [Member] m
    Inner Join (
      Select
        MemberID,
        DateDiff(hour, m.Dob, GetDate())/8766 As Years
      From
        [Member]
    ) As y
    On m.MemberID = y.MemberID
Where (
    (m.Gender = @Gender) or 
    @Gender Is Null
  ) And (
    (@Age = 1 And y.Year Between 15 and 18) Or
    (@Age = 2 And y.Year Between 19 and 25) 
  ) 

さらに良いことに、範囲を別のテーブルに追加することができますAgeRanges

+-------+------------+----------+
| AgeID | StartYears | EndYears |
+-------+------------+----------+
|     1 |         15 |       18 |
|     2 |         19 |       25 |
|   ... |        ... |      ... |
+-------+------------+----------+

Select
  [User]
From
  [Member] m
    Inner Join
  [AgeRanges] a
    On DateDiff(hour, m.Dob, GetDate())/8766 Between a.StartYears and a.EndYears And
       a.AgeID = @Age

メンバーテーブルに計算列を作成して、作業を簡素化することもできDateDiff(hour, m.Dob, GetDate())/8766ます(パフォーマンスが問題になった場合は、インデックス作成が可能になります)。

于 2012-11-18T12:30:36.917 に答える