복붙노트

[SQL] 동적 순서 방향

SQL

동적 순서 방향

나는 매개 변수 정렬 열 방향으로 받아들이는 SP를 작성.

나는 동적 SQL을 사용하지 않습니다.

문제는 방향 매개 변수를 설정하여입니다.

이 부분 코드입니다 :

SET @OrderByColumn = 'AddedDate'
SET @OrderDirection = 1;

…

ORDER BY 
    CASE WHEN @OrderByColumn = 'AddedDate' THEN CONVERT(varchar(50), AddedDate)
        WHEN @OrderByColumn = 'Visible' THEN CONVERT(varchar(2), Visible)
        WHEN @OrderByColumn = 'AddedBy' THEN AddedBy
        WHEN @OrderByColumn = 'Title' THEN Title    
    END

해결법

  1. ==============================

    1.당신은 항목 하나 ASC 한 DESC BY 두 개의 거의 동일한 순서가, 하나 또는 그 중 다른 하나는 항상 단일 값을 동일을 확인하기 위해 CASE 문을 확장 할 수 :

    당신은 항목 하나 ASC 한 DESC BY 두 개의 거의 동일한 순서가, 하나 또는 그 중 다른 하나는 항상 단일 값을 동일을 확인하기 위해 CASE 문을 확장 할 수 :

    ORDER BY
          CASE WHEN @OrderDirection = 0 THEN 1
          ELSE
               CASE WHEN @OrderByColumn = 'AddedDate' THEN CONVERT(varchar(50), AddedDate)
                    WHEN @OrderByColumn = 'Visible' THEN CONVERT(varchar(2), Visible)
                    WHEN @OrderByColumn = 'AddedBy' THEN AddedBy
                    WHEN @OrderByColumn = 'Title' THEN Title
               END
          END ASC,
          CASE WHEN @OrderDirection = 1 THEN 1
          ELSE
               CASE WHEN @OrderByColumn = 'AddedDate' THEN CONVERT(varchar(50), AddedDate)
                    WHEN @OrderByColumn = 'Visible' THEN CONVERT(varchar(2), Visible)
                    WHEN @OrderByColumn = 'AddedBy' THEN AddedBy           
                    WHEN @OrderByColumn = 'Title' THEN Title
               END
          END DESC
    
  2. ==============================

    2.당신은 당신의 데이터를 정렬 ROW_NUMBER를 사용하여 CASE를 단순화하고 효율적으로 편리한 정수 형식으로 변환 할 수 있습니다. 질문 2005 SQL 서버 태그가 특히 때문에

    당신은 당신의 데이터를 정렬 ROW_NUMBER를 사용하여 CASE를 단순화하고 효율적으로 편리한 정수 형식으로 변환 할 수 있습니다. 질문 2005 SQL 서버 태그가 특히 때문에

    이것은 또한 2 차 및 3 차 종류를 다루는 충분히 쉽게 확장

    나는 실제 SELECT 문을 단순화하고 주문 BY에 RBAR 평가의 가능성을 줄일 승수 다시로 사용했습니다

    DECLARE @multiplier int;
    
    SELECT @multiplier = CASE @Direction WHEN 1 THEN -1 ELSE 1 END;
    
    SELECT
         Columns you actually want
    FROM
        (
        SELECT
             Columns you actually want,
             ROW_NUMBER() OVER (ORDER BY AddedDate) AS AddedDateSort,
             ROW_NUMBER() OVER (ORDER BY Visible) AS VisibleSort,
             ROW_NUMBER() OVER (ORDER BY AddedBy) AS AddedBySort,
             ROW_NUMBER() OVER (ORDER BY Title) AS TitleSort
        FROM
             myTable
        WHERE
             MyFilters...
        ) foo
    ORDER BY
         CASE @OrderByColumn
            WHEN 'AddedDate' THEN AddedDateSort
            WHEN 'Visible' THEN VisibleSort    
            WHEN 'AddedBy' THEN AddedBySort
            WHEN 'Title' THEN TitleSort
         END * @multiplier;
    
  3. ==============================

    3.다음은 그 예이다 :

    다음은 그 예이다 :

    CREATE PROCEDURE GetProducts 
    ( 
        @OrderBy      VARCHAR(50), 
        @Input2       VARCHAR(30) 
    ) 
    AS 
    BEGIN 
        SET NOCOUNT ON 
    
        SELECT Id, ProductName, Description, Price, Quantity 
        FROM Products 
        WHERE ProductName LIKE @Input2 
        ORDER BY 
            CASE             
                WHEN @OrderBy = 'ProductNameAsc' THEN ProductName 
            END ASC, 
            CASE 
                WHEN @OrderBy = 'ProductNameDesc' THEN ProductName 
            END DESC 
    
    END
    

    여기에서:

    http://www.dominicpettifer.co.uk/Blog/21/dynamic-conditional-order-by-clause-in-sql-server-t-sql

  4. ==============================

    4.이것은 나를 위해 잘 작동합니다 - (여기서, 순서에 의해, 방향, 페이지 매김)

    이것은 나를 위해 잘 작동합니다 - (여기서, 순서에 의해, 방향, 페이지 매김)

    parameters
    
    @orderColumn  int ,
    @orderDir  varchar(20),
    @start  int ,
    @limit  int
    
    
    select * from items
    WHERE        (items.status = 1) 
    order by 
    
    CASE WHEN @orderColumn = 0 AND @orderdir = 'desc' THEN items.[category] END DESC,    
    CASE WHEN @orderColumn = 0 AND @orderdir = 'asc' THEN items.[category] END ASC,    
    CASE WHEN @orderColumn = 1 AND @orderdir = 'desc' THEN items.[category] END DESC,
    CASE WHEN @orderColumn = 1 AND @orderdir = 'asc' THEN items.[category] END ASC,
    CASE WHEN @orderColumn = 2 AND @orderdir = 'desc' THEN items.[category] END DESC,
    CASE WHEN @orderColumn = 2 AND @orderdir = 'asc' THEN items.[category] END ASC
    
    OFFSET @start ROWS FETCH NEXT @limit ROWS ONLY
    
  5. ==============================

    5.허용 대답의 컴팩트 버전,하지만 허용 대답으로이 THEN 후 결과 표현식 유형이 같을 경우에만 작동합니다.

    허용 대답의 컴팩트 버전,하지만 허용 대답으로이 THEN 후 결과 표현식 유형이 같을 경우에만 작동합니다.

    ORDER BY
        CASE @OrderDirection WHEN 0 THEN
            CASE @sortColumn
               WHEN 'AddedDate' THEN CONVERT(varchar(50), AddedDate)
               WHEN 'Visible' THEN CONVERT(varchar(2), Visible)
               WHEN 'AddedBy' THEN AddedBy
               WHEN 'Title' THEN Title
            END
        END ASC,
        CASE @OrderDirection WHEN 1 THEN
            CASE @sortColumn
               WHEN 'AddedDate' THEN CONVERT(varchar(50), AddedDate)
               WHEN 'Visible' THEN CONVERT(varchar(2), Visible)
               WHEN 'AddedBy' THEN AddedBy
               WHEN 'Title' THEN Title
            END
        END DESC
    
  6. from https://stackoverflow.com/questions/1147763/dynamic-order-direction by cc-by-sa and MIT license