0

我正在尝试根据传递给我的存储过程的一些参数来选择数据。我有年龄问题,我正在尝试做这样的事情:

如果我的存储过程参数@Age = 1然后我选择 15 到 18 岁之间的年龄,@Age = 2然后选择 19 到 25 岁...,显然这是不正确的,任何人都可以提供帮助。谢谢。:

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 回答