postgresql

query 항상 상위에 있는 게시물(공지) , UNION ALL

항상 상위에 있는 게시물

구분 할 수 있는 boolean 컬럼 추가

예제에선 top_yn

페이징 되어도 항상 상위에 게시물이 존재

UNION ALL

UNION ALL을 사용하면 된다.

(SELECT
   pk\_num,
   top\_yn
 FROM portal.bmt\_mp\_board
 WHERE top\_yn = TRUE
 ORDER BY top\_yn)
UNION ALL
(
  SELECT
    pk\_num,
    top\_yn
  FROM portal.bmt\_mp\_board
  ORDER BY pk\_num desc)

row_number

http://www.postgresqltutorial.com/postgresql-row_number/

ROW\_NUMBER() OVER(
    \[PARTITION BY column\_1, column\_2,…\]
    \[ORDER BY column\_3,column\_4,…\]
)

이전 글, 제목, 다음 글, 제목

SELECT no,title from table
WHERE no = (SELECT max(no)
                 FROM table
                 WHERE no < '${id}')

SELECT no,title from table
WHERE no = (SELECT min(no)
                 FROM table
                 WHERE no > '${id}')

postgresql COALESCE 함수, oracle NVL 함수

오라클에서는 질의 한 값이 null일경우 다른 값을 반환해주는 NVL 함수가 있다.

오라클 :  NVL(A,B) 함수는 A 가 NULL 이면 B 를 반환

postgresql에는 nvl함수가 없다.

대신 COALESCE 함수로 사용 가능

COALESCE(컬럼명, 반환 값)

COALESCE(comm, 0)

— 아래와 같이 질의 함

SELECT COMM, COALESCE(COMM,0) FROM TABLE

COALESCE은 오라클에서도 사용 가능

참고 :  그루비 NVL, NVL2, NULLIF, COALESCE

http://www.gurubee.net/lecture/1880

상품번호 한개에 한줄

2017110223333311

방법1

select order\_no,
  case
  when cnt=1 then prod\_name
  else prod\_name || ' 외 ' || cnt-1 || '건'
  end as title
from
  (select x.order\_no, z.prod\_name, x.cnt
   from
     (select purchase.order\_no as order\_no, count(\*) as cnt
      from purchase, request, prod
      where purchase.order\_no=request.order\_no
            and request.prod\_no=prod.prod\_no
      group by purchase.order\_no
      order by order\_no) x,
     (select distinct on (order\_no) order\_no as order\_no, prod\_no from request) y, prod z
   where x.order\_no=y.order\_no
         and y.prod\_no=z.prod\_no) a;

방법2

select v1.\*, v2.\*
from
  (select a.order\_no,
     max(a.prod\_no) as prod\_no,
     (select b.prod\_name from prod b where b.prod\_no = max(a.prod\_no)) as prod\_name
   from request a
   group by a.order\_no) v1,
  (select c.order\_no, count(\*)-1 as count
   from request c join prod d
       on c.order\_no = d.prod\_no
   group by c.order\_no) v2
where v1.order\_no = v2.order\_no

방법3

select
  order\_no,
  case when count=0 then prod\_name else prod\_name ||' 외' || count || ' 건' end as title
from (
       select v1.order\_no,v1.prod\_name,v2.count
       from
         (select a.order\_no,
            max(a.prod\_no) as prod\_no,
            (select b.prod\_name from prod b where b.prod\_no = max(a.prod\_no)) as prod\_name
          from request a
          group by a.order\_no) v1,
         (select c.order\_no, count(\*)-1 as count
          from request c join prod d
              on c.prod\_no = d.prod\_no
          group by c.order\_no) v2
       where v1.order\_no = v2.order\_no
     ) as v3;

Written by@MuseKim
Muse Kim