개요
select weekName from selectitem
이 쿼리를 썼을 경우 데이터에서 날짜의 대한 테이블의 날짜에 대한 데이터가 나온다.
이런 식으로 나오게되는데 여기서 나는 요일이 연달아 4개 이상이고, 끊기는 요일이 없을 경우
ex) 월~목, 월~일, 화~일
이런 방식으로 표시하기를 원했다.
이런 경우 데이터를 받아와서 서버 단에서 정렬해줘도 되지만 반복문을 써서 처리하는 경우가 대다수일거고
이번엔 DB의 함수 기능을 써서 처리해 주기로 하였다.
본문
일단 DBeaber 기준으로 설명하겠다.
여기서 프로시저 탭을 클릭하여 Create New Procedures 을 클릭해준다.
우리가 만들건 FUNCTION 이므로 FUNCTION 을 선택해준다.
만들었다면
이런식으로 생성되었을 것이다.
여기서 이제 function 을 제작해 줄 수 있는데
이미 만들어진 function 을 가지고 설명해 주겠다.
이런식으로 만들어지게 되는데
in compareString varchar(11)
이부분 같은 경우 처음 인수로 받게 되는 EX) 월화수목금,월화,
이런 컬럼의 데이터 값이 되게 된다.
DECLARE result VARCHAR(11) CHARACTER SET utf8;
DECLARE 같은 경우 함수내 에서 변수로 할당 해줄 객체를 생성하는 것이다.
타입도 설정할 수 있으며 이해가 안된다면 자바의 String , js 의 var 같은걸 생성했다고 이해하면 편할 것이다.
이제 본문인데
IF '월화수목금토일' LIKE CONCAT('%', compareString, '%') THEN
IF CHAR_LENGTH(compareString) < 4 THEN
SET result = compareString;
else
SET result = CONCAT(SUBSTRING(compareString, 1, 1), '~', SUBSTRING(compareString, CHAR_LENGTH(compareString), 1));
END IF;
ELSE
SET result = compareString;
END IF;
요악하자면 일단 '월화수목금토일' 이라는 요일 나열된거를 써주고 거기서
인수로 받은 '월화수목','월수금' 이것들을 like 를 이용해 문자열에 해당하는지 비교해주는 것이다.
만약 '월화수목' 같은경우
'월화수목금토일' 이라는 문자열에 들어가는 문자열이므로 ~ 로 정리해주는 case 에 해당하게 된다.
그러므로 해당문자열의 첫번째 자리와 끝번째 자리의 문자열을 따와 concat 을 이용해 ~(물결표)와 합쳐
새로운 문자열을 생성해준다.
만약 '월수금' 같은 경우
'월화수목금토일' 이라는 문자열에 '월','수','금' 이라는 문자가 들어가긴하지만 '월화수목금토일' 이라는
한 문자열 을 기준으로 봤을때 중간이 끊겨있으므로 해당하지 않는다.
그러므로 해당 문자열 그대로 return 하게 해준다.
결과
DECLARE 로 생성해준 결과값에 해당 문자열을 넣어주고 return 해준다.
테스트 해보자.
select ReturnWeekName(weekName) from selectitem;
이렇게 쿼리문을 돌렸을경우
월화수목금 에 해당하는 문자열이 월~금으로 변환되는 것을 확인할 수 있다.
마치며
이렇게 한번 FUNCTION 이라는 기능을 mariaDB 을 이용해서 간단하게 구현해보았다.
필자의 경험에 의하면 MSSQL,ORACLE 같은 경우도 이런 FUNCTION 기능과, PROCEDURE 는
문법의 차이만 있지 웬만하면 모두 존재하는걸로 알고 있다.
한번 이런 기능을 습득해 놓으면 다른 RDBMS 에서도 응용할 수 있다.
감사합니다.
'DB' 카테고리의 다른 글
Table 의 컬럼 들을 VO 타입으로 변환하는 법 (0) | 2023.11.06 |
---|