mysql, oracle 에서 한 컬럼의 값에 따라 임의의 순서대로 정렬하는 방법?

mysql 과 oracle DB를 같이 사용하고 있습니다.

예를 들어 아래와 같이 FRUIT 이라는 테이블에 NAME과 ORIGIN 라는 컬럼이 있을때

id	name		origin
--- ------------ ---------------
1 durian asia
2 kiwi asia
3 mangosteen asia
4 coconut latin
5 guava latin
6 tomato oceania
7 cherry oceania
8 apple oceania

첫번째 origin 컬럼의 값에 따라 oceania - asia - latin 의 값의 순서로 정렬하고
두번째 name 값으로 정렬하려고 합니다.

아래와 같이 말이죠

id	name		origin
--- ------------ ---------------
  8 apple oceania
  7 cherry oceania
  6 tomato oceania
  1 durian asia
  2 kiwi asia
  3 mangosteen asia
  4 coconut latin
  5 guava latin

단순히 order by origin 으로 하면 asia - latin - oceania 순서대로 나오기때문에 안되자나요.

어떻게 하면 위와 같이 정렬할 수 있을까요?

mysql, oracle 같은 쿼리로 되면 좋지만 만약 다르다면 각각 어떻게 해야될까요?

답변 2개

  • 투표순▲ 투표를 가장 많이 받은 순서로 정렬
  • 작성일순최신 작성된 순서로 정렬
(1)
6시내고향님과 같이 해도 되구요.
굳이 select 에서 해당 순서값을 뽑을 필요가 없다면
아래와 같이 하는것이 더 좋지 않을까 생각됩니다.
오라클도 case 구문을 지원하기때문에 똑같이 될꺼 같긴 하지만, 혹시 안되면 아래같이 decode 를 사용하면 될겁니다.

mysql 에서

SELECT
*
FROM
fruit
ORDER BY
(
CASE origin
WHEN 'oceania' THEN 1
WHEN 'latin' THEN 2
WHEN 'asia' THEN 3
ELSE 4
END
),
name

oracle 에서 (혹시 위 쿼리가 오라클에서 안된다면 아래와 같이)

SELECT
*
FROM
fruit
ORDER BY
DECODE(origin , 'oceania',1 , 'latin',2 , 'asia',3 , 4),
name


(2)
mysql 인 경우 이렇게 하시면 됩니다.
오라클도 비슷하게 하면 되지 않을까 생각됩니다.

SELECT
id,
name,
origin,
CASE origin
WHEN 'oceania' THEN 1
WHEN 'latin' THEN 2
WHEN 'asia' THEN 3
ELSE 4
END AS orderbyme
FROM
fruit
order by
orderbyme,
name  

답변쓰기

관련 post

Q

안녕하십니까 MySql 쿼리 질문 좀드릴게요 ㅠㅠ