November 29, 2017
항상 상위에 있는 게시물
구분 할 수 있는 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)
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}')
오라클에서는 질의 한 값이 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
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;
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
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;