/********************************************************************************************
-- Title : [2k8] 간단한 게시판 및 정렬 구현
-- Key word : 게시판 board 정렬 order 페이징 paging
********************************************************************************************/
-- 성능에 최적화된 페이징이 아님!!!
-- 그냥 간단한 게시판 구현시 사용.
USE tempdb;
GO
-- Title : [2k8] 간단한 게시판 및 정렬 구현
-- Key word : 게시판 board 정렬 order 페이징 paging
********************************************************************************************/
-- 성능에 최적화된 페이징이 아님!!!
-- 그냥 간단한 게시판 구현시 사용.
USE tempdb;
GO
--테이블 삭제
DROP TABLE board_t;
-- 테이블 생성
CREATE TABLE board_t
( idx INT NOT NULL PRIMARY KEY
, usr NVARCHAR(10) NOT NULL
, reg_dt NCHAR(8) NOT NULL
, ti NVARCHAR(30) NOT NULL
, note NVARCHAR(50) NULL
);
-- 데이터 입력
INSERT INTO board_t
SELECT 1, '유재석', '19990108', '두울하면 두부장수 두부를 판다고 덜덜덜', '비고8' UNION ALL
SELECT 2, '박명수', '20080808', '다섯하면 다람쥐가 알밤을 깐다고 덜덜덜', '비고2' UNION ALL
SELECT 3, '노홍철', '20110903', '일곱하면 일꾼들이 나무를 벤다고 덜덜덜', '비고9' UNION ALL
SELECT 4, '정준하', '20071232', '세엣하면 새색시가 시집을 간다고 덜덜덜', '비고4' UNION ALL
SELECT 5, '정형돈', '20020506', '여얼하면 열무장수 열무가 왔다고 덜덜덜', '비고7' UNION ALL
SELECT 6, '하하하', '19971025', '여섯하면 여학생이 공부를 한다고 덜덜덜', '비고3' UNION ALL
SELECT 7, '길길길', '20050530', '아홉하면 아버지가 신문을 본다고 덜덜덜', '비고10' UNION ALL
SELECT 8, '김태호', '20050408', '하나하면 할머니가 지팡이 들고서 덜덜덜', '비고5' UNION ALL
SELECT 9, '조욱형', '19970625', '여덟하면 엿장수가 박엿을 판다고 덜덜덜', '비고6' UNION ALL
SELECT 10, '김민종', '20101010', '네엣하면 냇가에서 빨래를 한다고 덜덜덜', '비고1';
/*
-- 페이징 및 정렬 처리
*/
-- 변수 선언
DECLARE @ord_num TINYINT; -- 정렬 컬럼
/* 10:usr asc, 11:usr desc, 20:reg_dt asc. 21:reg_dt desc */
/* 30:ti desc, 31:ti desc, 40:note asc, 41:note desc */
DECLARE @pgnum SMALLINT -- 페이지 번호
, @pgrow SMALLINT; -- 페이지당 ROW수
DECLARE @search_usr NVARCHAR(10) -- usr 검색어
, @search_ti NVARCHAR(10); -- ti 검색어
-- 변수 입력
SELECT @ord_num = 11, @pgnum = 1, @pgrow = 3;
SELECT @search_usr = '--', @search_ti = '%하면%';
-- 내용 출력
SELECT TOP (@pgrow) a.row_num, a.usr, a.reg_dt, a.ti, a.note
FROM
(
SELECT ROW_NUMBER() OVER(ORDER BY (CASE @ord_num WHEN 10 THEN usr END) ASC
, (CASE @ord_num WHEN 11 THEN usr END) DESC
, (CASE @ord_num WHEN 20 THEN reg_dt END) ASC
, (CASE @ord_num WHEN 21 THEN reg_dt END) DESC
, (CASE @ord_num WHEN 30 THEN ti END) ASC
, (CASE @ord_num WHEN 31 THEN ti END) DESC
, (CASE @ord_num WHEN 40 THEN note END) ASC
, (CASE @ord_num WHEN 41 THEN note END) DESC
) "row_num"
, usr, reg_dt, ti, note
FROM board_t
WHERE (usr = @search_usr OR @search_usr = '--')
AND (ti LIKE @search_ti OR @search_ti = '--')
) a
WHERE a.row_num BETWEEN ((@pgnum - 1) * @pgrow) + 1 AND (@pgnum * @pgrow);
-- 총건수/전체페이지수 출력
SELECT COUNT(*)
, (COUNT(*) + (@pgrow -1)) / @pgrow
FROM board_t
WHERE (usr = @search_usr OR @search_usr = '--')
AND (ti LIKE @search_ti OR @search_ti = '--');