2010-12-07 66 views
2

用就怎么用BETWEEN运营商与CASE声明如何运营商之间有case语句在SQL Server 2005中

@FromEmpAge 
@ToempAge 

select * from Emp 
where EmpAge between 
    case when ToempAge0 then @FromEmpAge and @ToempAge end 

如何做到这一点?

+0

如果您发布的代码或XML,** **请在高亮文本编辑器的线和编辑器工具栏上点击“代码”按钮(101 010)很好地格式化和语法突出它! – 2010-12-07 08:54:57

+2

这没有任何意义。你想达到什么目的? – 2010-12-07 08:58:13

回答

1

不知道它是否工作 - 但如果它没有,你就必须首先要确保正确完成您CASE声明!

SELECT 
    (list of columns) 
FROM 
    dbo.Emp 
WHERE 
    EmpAge BETWEEN 
     CASE (some column)      | this is the first value 
      WHEN ToEmpAge0 THEN @FromEmpAge | for the BETWEEN .... 
     END         | close the CASE 
     AND @ToempAge       | this is the second value 

CASE需要至少有一个WHEN....THEN....,然后一个END“关闭”,然后CASE - 只有在这之后,你可以继续走下去.....

但再次:不知道这是否会正常工作,甚至与“正确”的语法.....

0

我不知道你的意思ToEmpAge0什么。无论如何,marc_s已经回答了你的关于如何使用BETWEEN运营商内部CASE声明,如果你把WHEN后适当的文字值,将工作的问题。 您也可以使用CASE语句作为BETWEEN运算符的第二个操作数。

我会认为ToEmpAgeINT列:

SELECT 
    (list of columns) 
FROM 
    dbo.Emp 
WHERE 
    EmpAge BETWEEN 
     CASE ToEmpAge 
      WHEN 0 THEN @FromEmpAge 
      WHEN 1 THEN @FromEmpAge+10 --or whatever 
     END 
    AND 
     CASE ToEmpAge 
      WHEN 0 THEN @ToEmpAge 
      WHEN 1 THEN @ToEmpAge+5 
     END 
0
 SELECT * 
     FROM CTE 
     WHERE RN BETWEEN case @Excel when 0 then (@StartRow - cast(@NumberOfRows AS int)) else @NumberOfRows end 
        AND case @Excel when 0 then (@StartRow - 1) else @PageIndex end 
0
DECLARE @StartRow INT 
    SET @StartRow = (cast(@PageIndex as int) * cast(@NumberOfRows as int)) + 1 ; 


    WITH CTE 
       AS (SELECT ROW_NUMBER() OVER (ORDER BY CASE 
                  WHEN @SortColumnName = 'ID' 
                  AND @SortOrderBy = 'asc' 
                  THEN sod.ID 
                  END ASC, CASE 
                  WHEN @SortColumnName = 'ID' 
                  AND @SortOrderBy = 'desc' 
                  THEN sod.ID 
                  END DESC, CASE 
                  WHEN @SortColumnName = 'MessageText' 
                  AND @SortOrderBy = 'asc' 
                  THEN MessageText 
                  END ASC, CASE 
                  WHEN @SortColumnName = 'MessageText' 
                  AND @SortOrderBy = 'desc' 
                  THEN MessageText 
                  END DESC, CASE 
                  WHEN @SortColumnName = 'TO' 
                  AND @SortOrderBy = 'desc' 
                  THEN [TO] 
                  END DESC 
                  ) AS RN , 
    [SendedDate] 
    ,[UserID] 
    ,sod.[ID] 
    ,[SmsOutboxID] 
    ,[MessageID] 
    ,[FolderID] 
    ,[From] 
    ,[TO] 
    ,[MessageText] 
    ,[SendedType] 
    ,[SendedStatus] 
    ,[IsDelete] 
    ,[NumberOfMessage] 
    ,[MessageType] 
    ,[PricesbySMS] 
    ,[Sended] 


    FROM SMS_Outbox so inner join SMS_OutboxDetails sod on so.ID = sod.SmsOutboxID where so.UserID = @UserID and sod.SendedType = @Type and sod.IsDelete = 0) 

     SELECT * 
     FROM CTE 
     WHERE RN BETWEEN case @Excel when 0 then (@StartRow - cast(@NumberOfRows AS int)) else @NumberOfRows end 
        AND case @Excel when 0 then (@StartRow - 1) else @PageIndex end 
0

编写一个查询,将首字母显示员工的名字大写和小写所有其他字母和部门没有。对于其名称的第二个字符介于'A'和'M'之间的所有员工,请给每个栏目一个适当的标签。 我尝试了一些不起作用的东西。我的工作代码为:

SELECT INITCAP(ename), deptno 
FROM emp 
WHERE ename LIKE BETWEEN ('_A%' AND '_M%');