게시글 상세 보기 화면에서 게시글 번호를 기준으로 앞 글, 뒷 글로 넘어가는 paging button 동작이 필요했다. 우리가 아는 게시물 목록이 아닌, 바로 앞 글과 이전 글로 이동하기 위한 paging이라 부수적인 기능은 필요하지 않았다.
게시글 번호 +1, -1식으로 하기엔 게시글이 delete 되면 게시물 번호에 null이 있어서, 다른 대안이 필요했다. (delete 하지 않고 delete_yn column의 Y, N으로 따로 관리하지만 안정성을 위하여.)
lead와 leg 문법은 각 다음 행과 이전 행을 가져오는 문법이다.
Lead(기준컬럼, 1, 0): 다음 row 값. 기준컬럼 + 1 다음 값을 얻어 온다. 0은 null 대신 쓸 default 값이다.
leg: 이전 row 값. 기준컬럼 - 1 다음 값을 얻어 온다. 0은 null 대신 쓸 default 값이다.
SELECT
result.*
FROM (
SELECT
tp.posting_id,
LEAD(posting_id, 1) over(ORDER BY posting_id) nextPage,
lag(posting_id, 1) over(ORDER BY posting_id) prevPage
FROM tb_posting tp
WHERE delete_yn = 'N'
ORDER BY tp.posting_id DESC
) result
WHERE posting_id = 1001;
from절까지는 tb_posting에 있는 모든 posting_id의 앞 행과 뒷행을 가져오라는 내용이고, 해당 내용의 posting_id = 1001의 값만 가져오라는 query이다. 아래는 예시이다. 빈 값은 null이다.
from절 값
posting_id|nextPage|prevPage|
----------+--------+--------+
4755| | 4754|
4754| 4755| 4752|
4752| 4754| 4751|
4751| 4752| 4750|
4750| 4751| 4749|
4749| 4750| 4748|
4748| 4749| 4747|
4747| 4748| 4746|
4746| 4747| 4745|
4745| 4746| 4744|
4744| 4745| 4743|
4743| 4744| 4742|
query 도출 값
posting_id|nextPage|prevPage|
----------+--------+--------+
1001| 1002| |