Shape
- Shape만을 추출해낸다.
- 문자의 첫 글자를 대문자로 변환한다.
1 2 3 4 5
SELECT DISTINCT shape, INITCAP(shape) AS shape_clean FROM ( SELECT SPLIT_PART(SPLIT_PART(sighting_report, 'Duration', 1), 'Shape: ', 2) AS shape FROM ufo ) AS A;
Duration
- Duration을 추출한다.
- 앞 뒤 공백을 제거한다.
1 2 3 4 5
SELECT duration, TRIM(duration) AS duration_clean FROM ( SELECT SPLIT_PART(sighting_report, 'Duration:', 2) AS duration FROM ufo ) AS A;
Occurred, Reported, Posted
1
2
3
4
5
SELECT
SPLIT_PART(SPLIT_PART(SPLIT_PART(sighting_report, '(Entered', 1), 'Occurred : ', 2), 'Reported', 1) AS occurred,
SPLIT_PART(SPLIT_PART(SPLIT_PART(SPLIT_PART(sighting_report, 'Post', 1), 'Reported: ', 2), ' AM', 1), ' PM', 1) AS reported,
SPLIT_PART(SPLIT_PART(sighting_report, 'Location', 1), 'Posted: ', 2) AS posted
FROM ufo;
데이터 타입 변환
- 위 쿼리를 서브쿼리로 사용한다.
- 각 컬럼의 문자열 길이가 8개 이상인 것을 조건으로 사용한다.
- occurred를 오름차순으로 정렬한다.
[날짜 타입 변환]
- SET DATESTYLE = mdy;를 통해 현재 데이터 타입을 명시한다.
- ::TIMESTAMP 또는 ::DATE를 통해 변환할 데이터 타입을 설정한다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
-- 타입 변환 에러가 발생하지 않도록, 현재 저장된 문자열이 월/일/연도(month/day/year)의 포맷으로 저장되어 있음을 명시 SET DATESTYLE = mdy; SELECT occurred::timestamp, reported::timestamp, posted::date FROM ( SELECT SPLIT_PART(SPLIT_PART(SPLIT_PART(sighting_report, '(Entered', 1), 'Occurred : ', 2), 'Reported', 1) AS occurred, SPLIT_PART(SPLIT_PART(SPLIT_PART(SPLIT_PART(sighting_report, 'Post', 1), 'Reported: ', 2), ' AM', 1), ' PM', 1) AS reported, SPLIT_PART(SPLIT_PART(sighting_report, 'Location', 1), 'Posted: ', 2) AS posted FROM ufo ) AS A WHERE LENGTH(occurred) >= 8 AND LENGTH(reported) >= 8 AND LENGTH(posted) >= 8 ORDER BY 1;
CASE 구문 사용하여 데이터 타입 변환
- 위 쿼리를 CASE 구문을 사용하여 같은 결과를 나타낼 수 있다.
- occurred 컬럼에는 NULL이 존재하므로 조건을 추가해준다.
- 나머지는 동일하게 문자열의 길이가 8보다 작으면 NULL로 표시한다.
- 8자리를 기준으로 설정한 이유는
6/2/2023
일 경우 LENGTH가 8이기 때문에 저 형식을 기준으로 한 것 같다.1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
-- 타입 변환 에러가 발생하지 않도록, 현재 저장된 문자열이 월/일/연도(month/day/year)의 포맷으로 저장되어 있음을 명시 SELECT (CASE WHEN occurred = '' THEN NULL WHEN LENGTH(occurred) < 8 THEN NULL ELSE occurred::TIMESTAMP END) AS occurred, (CASE WHEN LENGTH(reported) < 8 THEN NULL ELSE reported::TIMESTAMP END) AS reported, (CASE WHEN LENGTH(posted) < 8 THEN NULL ELSE posted::TIMESTAMP END) AS posted FROM ( SELECT SPLIT_PART(SPLIT_PART(SPLIT_PART(sighting_report, '(Entered', 1), 'Occurred : ', 2), 'Reported', 1) AS occurred, SPLIT_PART(SPLIT_PART(SPLIT_PART(SPLIT_PART(sighting_report, 'Post', 1), 'Reported: ', 2), ' AM', 1), ' PM', 1) AS reported, SPLIT_PART(SPLIT_PART(sighting_report, 'Location', 1), 'Posted: ', 2) AS posted FROM ufo ) AS A ORDER BY 1;
Location
1
2
3
4
5
6
7
8
SELECT
location,
REPLACE(REPLACE(location, 'close to', 'near'), 'outside of', 'near') AS location_clean
FROM (
SELECT SPLIT_PART(SPLIT_PART(sighting_report, 'Shape', 1), 'Location: ', 2) AS location
FROM ufo
) AS A
ORDER BY 1;
Occurred, Entered, Reported, Posted, Shape, Duration 텍스트 변환
- SPLIT_PART() 함수를 통해 각각의 컬럼에 해당하는 텍스트를 추출한다.
- 위 내용을 서브쿼리로 사용한다.
- 문자열의 길이가 8개 미만일 경우 NULL, 아닐 경우 날짜 데이터 변환한다.
- location은 close to와 outside of 문자를 near로 변경한다.
- shape는 첫 문자를 대문자로 변환한다.
- duration은 양쪽의 공백을 제거한다.
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 31
SET datestyle = 'mdy'; SELECT (CASE WHEN occurred = '' THEN NULL WHEN LENGTH(occurred) < 8 THEN NULL ELSE occurred::TIMESTAMP END) AS occurred, entered_as, (CASE WHEN LENGTH(reported) < 8 THEN NULL ELSE reported::TIMESTAMP END) AS reported, (CASE WHEN posted = '' THEN NULL ELSE posted::DATE END) AS posted, REPLACE(REPLACE(location, 'close to', 'near'), 'outside of', 'near') AS location, INITCAP(shape) AS shape, TRIM(duration) AS duration FROM ( SELECT SPLIT_PART(SPLIT_PART(SPLIT_PART(sighting_report, '(Entered', 1), 'Occurred : ', 2), 'Reported', 1) AS occurred, SPLIT_PART(SPLIT_PART(sighting_report, ')', 1), 'Entered as : ', 2) AS entered_as, SPLIT_PART(SPLIT_PART(SPLIT_PART(SPLIT_PART(sighting_report, 'Post', 1), 'Reported: ', 2), ' AM', 1), ' PM', 1) AS reported, SPLIT_PART(SPLIT_PART(sighting_report, 'Location', 1), 'Posted: ', 2) AS posted, SPLIT_PART(SPLIT_PART(sighting_report, 'Shape', 1), 'Location: ', 2) AS location, SPLIT_PART(SPLIT_PART(sighting_report, 'Duration', 1), 'Shape: ', 2) AS shape, SPLIT_PART(sighting_report, 'Duration:', 2) AS duration FROM ufo ) AS A ORDER BY 1;