[SQL] 책 제목 정렬하기

ziwww·2024년 5월 29일

개발

목록 보기
12/14

Intro

책 제목을 정렬할 때 그냥 order by title로 하니까 문제가 발생하였다.

처음에는 이런 쿼리로 정렬을 했는데

SELECT b.title
FROM book b
WHERE b.category_id='106'
order BY title;


이런식으로 뒤죽박죽 정렬이 되었다,,

위의 원인은 숫자가 문자랑 혼합되면서 숫자 또한 문자로 인식되기 때문..
문장의 순서대로 정렬을 하기 때문에 1 다음 2가 와야되는데 11이 더 작은걸로 인식함..

그래서 다른 해결 방법이 필요하였다.

해결 방법

해결방법은 정규식을 사용하여 해결하는 방식이다.

우선 숫자를 제외한 문자를 정렬 한 뒤, 문자를 제외한 숫자를 정렬하였다.

SELECT b.title
FROM book b
WHERE b.category_id='106'
order BY REGEXP_REPLACE(b.title, '[0-9]', ''), REGEXP_REPLACE(b.title, '[^0-9]', '')*1;

잘 정렬되었다!!!
근데, 자세히 보니 문제점이 있었음...


얘는 왜 이러는거지?? 하고 봤더니

가짜 동맹 1 (한정판) - 종이 홀더 + 네컷 사진 1장 + 포토카드 1장 + 증명사진 2장 + 학생증 1종 + 스티커 2종 + 엽서 1종
이런 제목이라 숫자 이외의 것들을 제거하면 112121이 남게된다... 이러면 제대로 정렬이 안됨.

만약 제목+숫자 일 경우에는 저 방식을 쓰면 된다.
하지만 내 경우엔 조금 다르기 때문에 다른 방법을 사용하였다.

SELECT 
    b.*
FROM 
    book b
WHERE 
    b.category_id='106'
ORDER BY 
    REGEXP_REPLACE(b.title, '[0-9]+.*', ''), REGEXP_REPLACE(REGEXP_SUBSTR(b.title, '[^0-9]+[0-9]+[^+\\-():]*'),'[^0-9]','')*1;

위의 쿼리를 쓰니 깔끔하게 다 잘 나온다.

책 제목의 규칙을 찾아 해결할 수 있었음

책 제목이 보통 문자 뒤에 시리즈 권수가 나오고 그 뒤에 기념품이나 설명이 추가되어있는 경우 특수문자가 중간에 꼭 껴있는 걸 볼 수 있다.

  • 그 알파를 꼬시는 법 시즌 1 : 1~2 세트 - 전2권 (특별판) - 엽서 2종 + 책갈피 2종 + 투명 포토카드 2종 + 네컷필름 2종 (경주 우영) + 우영SD 띠부씰 4종
  • 나의 히어로 아카데미아 36 + 2023 캘린더 한정판
  • 나의 히어로 아카데미아 39 + 2024 캘린더 한정판 - ‘귀여운 소녀’ 일러스트 카드 + 아크릴 일러스트 보드 + 갤러리 카드 3종 + 스페셜 L홀더

이렇게 되면 특수 문자 뒤에 있는 문자들은 필요 없고 그 앞에 있는 문자들만 가져오면 된다.
하지만 특수문자로 자르기에는 제목 사이에 특수문자가 있는 경우도 있으니

REGEXP_REPLACE(b.title, '[0-9]+.*', ''), REGEXP_REPLACE(REGEXP_SUBSTR(b.title, '[^0-9]+[0-9]+[^+\\-():]*'),'[^0-9]','')*1;

이런식으로 해결함

우선 숫자를 제외한 문자 정렬은 앞의 방식과 같다.
그 이후,

  • [^0-9]+: 하나 이상의 숫자가 아닌 문자.
  • [0-9]+: 하나 이상의 숫자.
  • [^+-():]*: +, -, (, ), : 특수문자가 아닌 문자가 0번 이상 반복.

    즉, 이 정규 표현식은 숫자가 아닌 문자들로 시작하고 그 뒤에 숫자가 나오며, +, -, (, ), : 문자를 포함하지 않는 문자열을 찾는다.

또한, 그렇게 자른 문자열에서 문자를 제거한 후 숫자만 남긴 후 정렬한다.

REGEXP_REPLACE(..., '[^0-9]','')

이런식으로 정렬하면 책 제목을 깔끔하게 정렬할 수 있다!

profile
반갑습니다. 오늘도 즐거운 하루입니다.

0개의 댓글