2016-10-10 2 views
0

Я использую SQL Server 2012. Я пытаюсь установить предложение WHERE с конкретным условием. PAE.CaseStatusId содержит значения 1, 2, 4, 8, 16. Идея заключается в использовании Побитового & для выбора условия для WHERE. Например, если @CaseStatusSum = 3, выберите CaseStatusId IN (1, 2); if @CaseStatusSum = 4, затем выберите CaseStatusId = 4 и т. д. У меня есть проблема с установкой условия с IFF или CASE. Интересно, есть ли в любом случае решение этой проблемы. Любой вход оценивается. Спасибо.SQL Server 2012 WHERE IN CONDITION IFF Case..WHEN

CREATE PROCEDURE [dbo].[getPagingPatientLiteByNameTest] 
(
@CaseStatusSum INT, 
@FilterCriteria NVARCHAR(50), 
@PageNo INT = 1, 
@PageSize INT = 10, 
@SortColumn NVARCHAR(40) = 'OperationDate', 
@SortOrder NVARCHAR(4) = 'DESC' 
) 
AS 
BEGIN 

DECLARE 
@lFilter NVARCHAR(50), 
@lSortCol NVARCHAR(40), 
@lFirstRec INT, 
@lLastRec INT, 
@lTotalRows INT, 


SET NOCOUNT OFF 
/* Setting local variable */ 
SET @lFilter = LTRIM(RTRIM(@FilterCriteria)) 
SET @lSortCol = LTRIM(RTRIM(@SortColumn)) 
SET @lFirstRec = (@PageNo - 1) * @PageSize + 1 
SET @lLastRec = @PageNo * @PageSize 
SET @lTotalRows = @lLastRec - @lFirstRec + 1 


; WITH CTE_Results 
AS (
SELECT ROW_NUMBER() OVER (ORDER BY 
    CASE WHEN (@SortColumn = 'OperationDate' AND @lSortCol = 'ASC') 
      THEN OpDate 
    END ASC, 
    CASE WHEN (@SortColumn = 'OperationDate' AND @lSortCol = 'DESC') 
      THEN OpDate 
    END DESC, 
    CASE WHEN (@SortColumn = 'HN' AND @lSortCol = 'ASC') 
      THEN HN 
    END ASC, 
    CASE WHEN (@SortColumn = 'HN' AND @lSortCol = 'DESC') 
      THEN HN 
    END DESC, 
    CASE WHEN (@SortColumn = '') 
      THEN OpDate 
    END DESC 
) AS ROWNUM, 
    Count(*) over() AS TotalCount, 
    Id, 
    RecOut, 
    CaseStatusId, 
    LastName, 
    OpDate 
    FROM PAE 
    WHERE 
     (CaseStatusId = (
      CASE @CaseStatusSum 
       WHEN 1 THEN 1 
       WHEN 2 THEN 2 
       WHEN 4 THEN 4 
       WHEN 8 THEN 8 
       WHEN 16 THEN 16 
      END) 

     /* MS SQL Server 2012 
      In the following commented section, neither IIF nor IF..ELSE work. 
      My goal is IF @CaseStatusSum = 3 THEN select CaseStatusSum IN (1, 2) and 
      IF @CaseStatusSum = 8 THEN select CaseStatusSum IN (8)/CaseStatusSum = 8 

     -- here is the problem, I am unable to get 1, 2 out of IIF to the IN condition 
      OR CaseStatusId IN (IIF(@CaseStatusSum = 3, (1 2), 0)) 

     -- here is the problem: IF is not allow in this structure 
      OR IF (@CaseStatusSum = 3) 
        BEGIN 
         CaseStatusId IN (1, 2) 
        END 
       ELSE 
        BEGIN 
         CaseStatusId = 4 
        END 
       END IF 
     */ 

      OR CaseStatusId = (
      CASE @CaseStatusSum 
       WHEN 1 THEN 4 
       WHEN 2 THEN 2 
       WHEN 4 THEN 4 
       WHEN 8 THEN 8 
       WHEN 16 THEN 16 
      END) 
     ) 

     AND RecOut > getDate() 
     AND (@lFilter IS NULL OR (LastName LIKE @lFilter)) 
) 
SELECT 
    TotalCount, 
    Id, 
    RecOut, 
    CaseStatusId, 
    LastName, 
    OpDate 
FROM CTE_Results 
WHERE 
    ROWNUM BETWEEN @lFirstRec AND @lLastRec 
ORDER BY ROWNUM ASC 


END 

ответ

0

Поскольку существует максимум 3 сценариев CaseStatusId в любой момент времени, я мог бы использовать ИЛИ там ИНЕК. Корпус 1, 2, 4, 8 или 16 - имеет одну уникальную комбинацию Корпус 3, 5, 6 и 7 - имеют более одной комбинации. Случай 3: комбинации 1, 3 Случай 5: Комбинации 1, 4 Случай 6: комбинации: 2, 4 чехол 7: комбинации: 1, 2, 4

Declare 
@lCaseStatusId1 INT, 
@lCaseStatusId2 INT, 
@lCaseStatusId3 INT 
: 
: 
SET NOCOUNT OFF 
/* Setting local variable */ 
IF @AssignedTo < 0 
    SET @lAssignedTo = null 
ELSE 
    SET @lAssignedTo = @AssignedTo 

IF @CaseStatusSum = 16 
BEGIN 
    SET @lCaseStatusId1 = 16 
    SET @lCaseStatusId2 = null 
    SET @lCaseStatusId3 = null 
END 
ELSE IF @CaseStatusSum = 8 
BEGIN 
    SET @lCaseStatusId1 = 8 
    SET @lCaseStatusId2 = null 
    SET @lCaseStatusId3 = null 
END 
ELSE IF @CaseStatusSum = 7 
BEGIN 
    SET @lCaseStatusId1 = 4 
    SET @lCaseStatusId2 = 2 
    SET @lCaseStatusId3 = 1 
END 
ELSE IF @CaseStatusSum = 6 
BEGIN 
    SET @lCaseStatusId1 = 4 
    SET @lCaseStatusId2 = 2 
    SET @lCaseStatusId3 = null 
END 
ELSE IF @CaseStatusSum = 5 
BEGIN 
    SET @lCaseStatusId1 = 4 
    SET @lCaseStatusId2 = 1 
    SET @lCaseStatusId3 = null 
END 
ELSE IF @CaseStatusSum = 4 
BEGIN 
    SET @lCaseStatusId1 = 4 
    SET @lCaseStatusId2 = null 
    SET @lCaseStatusId3 = null 
END 
ELSE IF @CaseStatusSum = 3 
BEGIN 
    SET @lCaseStatusId1 = 2 
    SET @lCaseStatusId2 = 1 
    SET @lCaseStatusId3 = null 
END 
ELSE IF @CaseStatusSum = 2 
BEGIN 
    SET @lCaseStatusId1 = 2 
    SET @lCaseStatusId2 = null 
    SET @lCaseStatusId3 = null 
END 
ELSE IF @CaseStatusSum = 1 
BEGIN 
    SET @lCaseStatusId1 = 1 
    SET @lCaseStatusId2 = null 
    SET @lCaseStatusId3 = null 
END 
: 
: 
    WHERE 
     (CaseStatusId = @lCaseStatusId1 
     OR CaseStatusId = @lCaseStatusId2 
     OR CaseStatusId = @lCaseStatusId3) 
      AND RecOut > getDate() 
: 
: