티스토리 뷰

Log/.TIL

[TIL]180611-0612

가그린민트 2018. 6. 12. 09:00


1. decode vs case, URL 추출하기

#### 코드값을 레이블로 변경하기
로그데이터 혹은 업무데이터에 코드값으로 저장한 경우 집계에 그대로 사용하면 리포트의 가독성이 떨어지므로 변환작업이 필요하다.
SELECT
user_id
, CASE
WHEN register_device = 1 THEN '데스크톱' /* WHEN : 비교 조건을, THEN : WHEN 조건이 TRUE일 때 */
WHEN register_device = 2 THEN '스마트폰' /* 위 조건이 FALSE 일경우 다음 WHEN으로 */
WHEN register_device = 3 THEN '애플리케이션'
ELSE '' /* 모든 조건이 해당되지 않을 때 */
END AS device_name
FROM mst_users
/* 위의 CASE문은 탐색 Case문이다. 이 경우 다양한 비교조건을 사용할 수 있다.
단순 Case문으로 변환하면, */
SELECT
user_id
, CASE register_device
WHEN 1 THEN '데스크톱'
WHEN 2 THEN '스마트폰'
WHEN 3 THEN '애플리케이션'
ELSE ''
END AS device_name
FROM mst_users
위의 SQL은 ANSI에서 가능하고, ORACLE에서는 DECODE 구문을 사용할 수 있다.
DECODE(컬럼 or 계산식, 조건1, 답1[, 조건2, 답2, 조건3, 답3, .., ELSE값])
/* register_device 값이 1일때, 2일때, 3일때, 1이나 2가 아닐경우의 결과를 추출 */
SELECT DECODE(register_device, 1, '데스크톱', 2, '스마트폰', 3, '애플리케이션', '') AS device_name
FROM mst_users
/* DECODE 구문은 부등호 조건 처리가 되지 않기 때문에 예전엔 (SIN함수를 이용해서) 계산을 통해 처리하는 방법이 있었다. */
#### URL에서 요소 추출하기
/* 레퍼러로 어떤 웹 페이지를 거쳐 넘어왔는지 판별해야 하는 경우가 있다.
이 경우 페이지 단위로 집계하면 복잡해져서 Host 단위로 집계하는 것이 일반적이다.
posrgreSQL은 SUBSTRING에 그룹을 사용하여, Hive 혹은 SparkSQL의 경우 parse_url 함수로, big query의 경우 host 함수로 해결 가능하다.
*/
SELECT
stamp
, SUBSTRING_INDEX(SUBSTRING_INDEX(SUBSTRING_INDEX(SUBSTRING_INDEX(referrer, '/', 3), '://', -1), '/', 1), '?', 1) AS referrer_host
FROM access_log

mysql 8.0버전에는 regexp_replace, regexp_substr 함수가 있던데 이 부분 확인해봐야겠다.

https://dev.mysql.com/doc/refman/8.0/en/regexp.html


2. spring-redis

이번 프로젝트에서 뭐 굳이 redis를 쓸 필요까지 있겠느냐만(그리고 실제로도 적용할지는 고민이긴하지만), 추후 다른 프로젝트에서 buffer db로 redis를 사용할지도 모르니 토이프로젝트는 진행해보고 있다. 

https://gist.github.com/Xeoncross/334abb4da23dd31be4438271cc548e76


3. 표준화에 대한 고민

다른 팀의 제멋대로식 업무 처리만 비판하지 말고 우리가 표준화해야할 것은 무엇인지도 돌아보아야하겠다.


4. null값 default 값으로 대치하기

/*
값이 없는 데이터를 의미하는 NULL
NVL(t1, t2) : t1의 값이 NULL일 경우 t2의 값으로 대체
(t1과 t2의 데이터 타입은 동일해야 함)
NVL2(t1, t2, t3) : t1의 값이 NOT NULL일 때 t2, NULL일 때 t3의 값으로 대체
(t2의 데이터 타입으로 t3가 맞춰짐)
COALESCE(expr1,expr2,expr3,…)
expr1이 NULL이 아니면 expr1값을 그렇지 않으면 COALESCE(expr2,expr3,…)값을 반환
*/
/* ORACLE */
SELECT empno, NVL(mgr, 0) mgr
FROM emp
WHERE deptno = 10;
SELECT empno, NVL2(mgr, 1, 0) mgr
FROM emp
WHERE deptno = 10;
/* ANSI에서도 가능 */
SELECT COALESCE(comm,1), comm
FROM emp;
/*
그룹함수와 NVL 처리 : 그룹함수에서 NULL은 연산에서 제외된다는 기본 규칙만 알아두면, 효율적인 처리를 고안할 수 있다.
DECODE나 CASE WHEN의 경우 ELSE 처리에서 불필요하게 0을 넣지 말자.
그룹함수가 쓰이고 나서 최종적으로 NULL인 상태에 대해서 NVL처리를 해주자
*/
/*
' '(BLANK) 데이터가 NULL일까?
보이지 않아도 값인 BLANK이기 때문에 NULL로 인식되지 않는다.
TRIM & NVL 처리
공백에 대해서 TRIM으로 공백 제거하면 공백이 없어지니 NULL과 같아짐
*/


'Log > .TIL' 카테고리의 다른 글

[TIL]180618  (0) 2018.06.18
[TIL]180613-0617  (0) 2018.06.17
[TIL]180608  (0) 2018.06.08
[TIL]180606  (0) 2018.06.06
[TIL]180423-0429  (0) 2018.04.30
댓글
링크
최근에 달린 댓글
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
Total
Today
Yesterday