작성일자 : 2024-01-11
Ver 0.1.1
0. Intro
Tableau 대시보드 개발을 하는 와중 처음 받는 요건을 받아보았다.
디지털 정보의 용량 데이터인 8GB, 16TB, 1.5Gb, 4G 등 다양한 문자열의 길이와 다양한 단위가 있는 컬럼을 한가지의 단위로 환산을 해야하는 요건이었다.
이를 위해선 해당 컬럼에서 숫자 컬럼과 단위 컬럼을 나눈 후 기준이 되는 단위로 환산을 해야했는데, 숫자 및 단위 길이도 제각각이고 소수점 등 케이스가 많아서 어떻게 식을 짜야 효율적으로 식을 짤 수 있을지에 대한 고민이 생겼다.
이 문제는 Tableau 대시보드에서 해결하지 않고, Oracle에서 해결했는데 DBA분께서 TRANSLATE 함수와 TRIM, NVL 함수를 함께 활용하여 해결을 해주셨다. 문자열을 대체하는 함수로 대표적으로는 REPLACE가 있는데, TRANSLATE라는 함수가 있는 것은 몰랐다.
코딩뿐만 아니라 쿼리문을 다루는데 있어서 물론 잘 작성하는 것도 중요하지만, 함수를 아는지에 대한 여부도 중요하다는 것을 다시 한번 느끼게 되었다.
그래서 이번 포스팅에서는 앞으로 유용하게 사용할 수 있을 것 같은 TRANSLATE 함수에 대해서 정리해보겠다.
1. Syntax
TRANSLATE 함수의 사용법은 아래와 같다.
TRANSLATE(string, from_string, to_string)
TRANSLATE 함수는 특정 문자를 지정된 문자로 치환된 문자열을 반환한다.
문자를 치환하는 함수는 대표적으로 REPLACE()가 있는데 이 둘은 작동 방법이 다르다.
REPLACE와의 차이점에 대해서는 따로 다루어보도록 하겠다.
Syntax만 보았을 때는 이해가 되지 않으니 예시를 통해 결과를 살펴보도록 하자.
2. Example
Oracle의 샘플 데이터인 EMP 테이블의 JOB 컬럼을 조회하면 아래와 같다.
SELECT JOB
,LENGTH(JOB) AS JOB_LEN
FROM SCOTT.EMP
나는 JOB 컬럼에서 'ANE'가 있는 문자열을 '12'로 변경해보고자 한다.
이를 쿼리로 작성한 것과 결과는 아래와 같다.
SELECT TRANSLATE(JOB, 'ANE','12') AS TRANSLATE
,LENGTH(TRANSLATE(JOB, 'ANE','12')) AS TRANSLATE_LEN
FROM SCOTT.EMP
위 쿼리를 사용하면 각각 'A'는 '1'로, 'N'는 '2' 로, 'E'는 매칭되는 문자열이 없으므로 공백으로 대체된다.
TRANSLATE 함수를 사용하면 단일 문자열부터 복수개의 문자열 치환, 문자 제거를 비교적 쉽게 할 수 있다.
뿐만 아니라 아래 쿼리처럼 NVL이나 TRIM 등과 같은 다른 함수들과 함께 사용한다면 효율적인 쿼리 작성이 가능해진다.
SELECT DENSITY
,TO_NUMBER(NVL(TRANSLATE(DENSITY,'TBGMyte',' '),0)) AS DENSITY_VALUE
,TRIM(TRANSLATE(DENSITY,'.1234567890',' ')) AS DENSITY_VALUE
FROM Table
문자열을 잘 다루는 것은 SQL에서나 Tableau에서도 중요한 것인데, 특히 Oracle에서는 TRANSLATE 함수를 사용할 수 도 있다는 것을 알아두면 좋을 것같다.