-
[PostgreSQL] 페이징 쿼리 작성하기IT/Database 2018. 12. 16. 18:42
게시판이나 안드로이드에서 한번에 보여줄 수 있는 데이터는 한정적이기 때문에(물론..보여줄순있다)
사용자가 지정한 정렬조건으로 일부데이터만 보여주고 필요에 의해서 이후 데이터를 보여주는 방식을 많이 사용한다.
그러기 위해서는 필요한 데이터만 효율적으로 보여줘야 하는데
이 때, 페이징쿼리를 작성한다.
Query
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950SELECTEND_PAGE,CAFE_ID,CAFE_NM,CAFE_IMG_NM,CAFE_IMG_DIR,PRICE,LUNCH_YN,DINNER_YN,OPER_TIME,BUILD_ADDR,BUILD_NM,BUILD_TEL,BUILD_HOME,BUILD_KEY,BUILD_X,BUILD_Y,COALESCE(BUILD_SCORE,0) AS BUILD_SCORE,ROUND(CAST(DISTANCE AS NUMERIC),0) AS DISTANCE,USE_YN,INS_USER_DTM,UPD_USER_DTMFROM(SELECT(CASE WHEN 1 * 10 < COUNT(*) OVER() THEN 'FALSE'WHEN 1 * 10 >= COUNT(*) OVER() THEN 'TRUE' END) AS END_PAGE,CAFE_ID,CAFE_NM,CAFE_IMG_NM,CAFE_IMG_DIR,PRICE,LUNCH_YN,DINNER_YN,OPER_TIME,BUILD_ADDR,BUILD_NM,BUILD_TEL,BUILD_HOME,BUILD_KEY,BUILD_X,BUILD_Y,(SELECT ROUND(AVG( COMMENT_SCORE),1) FROM PUBLIC.CAFE_COMMENT WHERE CAFE_ID=CAFE.CAFE_ID GROUP BY CAFE_ID) AS BUILD_SCORE,(select earth_distance(ll_to_earth(37.483422, 126.891111), ll_to_earth(CAFE.BUILD_X,CAFE.BUILD_Y))) AS DISTANCE,USE_YN,INS_USER_DTM,UPD_USER_DTMFROM PUBLIC.CAFE AS CAFEORDER BY DISTANCE ASCLIMIT 10 OFFSET (1 - 1) * 10) CAFEcs 48 line : Distance 거리별로 정렬
49 line : 10row를 가지고 오는데 0번째부터 9번째까지 10row를 가지고온다
25~26 line : 현재까지 가지고 온 데이터가 끝인지 아니면 더 가지고 올 데이터가 있는지 판별하는 변수
생각해 볼 부분
SQLP자격증을 준비하면서 정말 많이 공부했었던 페이징처리 쿼리
실제로 적용한적은 없었는데 이번에 작은 프로젝트를 진행하면서 적용해봤다.
위 쿼리에서 핵심은
가장 안쪽 인라인뷰에서 Order by를 하고
정렬된 상태에서의 LIMIT 10 OFFSET (1 - 1) * 10 을 통해
필요한 부분을 가지고 오는 것이다.
또, END_PAGE컬럼은 현재 20~30번째 데이터를 가지고 온다고 할 때
지금까지 30번째 로우 데이터를 가지고 왔을텐데
COUNT(*) OVER()을 통해 총 로우 수 보다 크거나같은지 혹은 작은지를 비교해
데이터가 더 있는지 판별하는 부분이 핵심이다.
페이징처리를 하는데 있어서
DB마다 문법이 조금씩 다르기 때문에
어떻게 적용하는지 확인을 배봐야 한다.
Oracle이라면 rownum을 이용히고
Sqlserver면 TOP을 이용하고..
위 쿼리는 안드로이드 리스트뷰에 적용하려고 작성한 쿼리이지만
이 기본적인 방법을 활용해서
웹에 게시판이라던지 활용할 수 있는 방법이 많다
'IT > Database' 카테고리의 다른 글
[Oracle] Update Select 방법 및 bypass_ujvc (1) 2019.02.18 [PostgreSQL] 특정 위치에서 가까운 거리순 정렬하기 쿼리로만(위도,경도) (0) 2018.12.03 [PostgreSQL] Windows에서 다운로드 및 설치 (+pgAdmin) (0) 2018.10.18 댓글