| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 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 |
- Github
- PANDAS
- django
- numpy
- PostgreSQL
- dataframe
- Python
- hive
- PySpark
- c#
- 파이썬
- Java
- Redshift
- array
- GIT
- string
- list
- Excel
- math
- Apache
- matplotlib
- Presto
- Tkinter
- Google Excel
- SQL
- Kotlin
- Google Spreadsheet
- gas
- google apps script
- Today
- Total
달나라 노트
Redshift : regexp_replace (regular expression replace) 본문
Redshift : regexp_replace (regular expression replace)
CosmosProject 2020. 12. 23. 23:08
Redshift에선 Regular expression을 이용한 replace 기능을 제공합니다.
regexp_replace(old_text, re_exp_pattern, new_text)
regexp_replace의 사용법은 위와 같습니다.
old_text에서 re_exp_pattern과 일치하는 부분을 찾아 new_text로 바꾸라는 뜻이죠.
select regexp_replace('abc@123.com', '@.*\\.com', '') -> abc 반환
, regexp_replace('abc@email.com', '@.*\\.com', '') -> abc 반환
, regexp_replace('abc@email123.com', '@.*\\.com', '') -> abc 반환
;
위 쿼리의 결과는 모두 abc를 반환합니다.
한번 re_exp_pattern 부분을 봅시다.
@.*\\.com
@ -> @는 별도의 기능이 없으니 문자 @ 그자체를 의미합니다.
. -> .은 모든 문자를 의미합니다.
* -> *은 바로 왼쪽의 문자가 0번 이상 반복되는 것을 의미합니다. (e.g. a*라고 하면 '', 'a', 'aa', 'aaa', 'aaaa', ... 등의 모든 것을 포함하는 의미를 가집니다.)
\\. -> 앞에서 .은 모든 문자를 의미한댔는데 이렇게 기능을 가진 기호 앞에 백슬래쉬를 2개 붙이면 escape가 되어 문자 그자체를 의미합니다. 즉 이건 마침표 그 자체를 텍스트로 인식하라는 의미입니다.
com -> 이것은 그냥 com 텍스트 그 자체입니다.
다 종합해보면 @.*\\.com 이라는 정규표현식은
@(0개 이상의 텍스트).com 의 패턴을 가진 모든 텍스트를 찾으라는 뜻이죠.
-> 즉, 메일의 id@mail.com에서 @mail.com 부분을 인식하라는 뜻입니다.
따라서 위 식은 @부터 .com까지 모든 문자가 공백('')으로 바뀌는거죠.
select regexp_replace('abc@123.com', '@.*\\.com', '_replaced') -> abc_replaced 반환
, regexp_replace('abc@email.com', '@.*\\.com', '_replaced') -> abc_replaced 반환
, regexp_replace('abc@email123.com', '@.*\\.com', '_replaced') -> abc_replaced 반환
;
동일한 예시지만 공백이 아닌 다른 문자로 대체하는 경우입니다.
select regexp_replace('abc(def)', '\\(.*\\)', '') -> abc 반환
, regexp_replace('abc(123456)', '\\(.*\\)', '') -> abc 반환
, regexp_replace('abc(def123xyz456)', '\\(.*\\)', '') -> abc 반환
;
위 예시도 모두 결과로 abc를 반환합니다.
여는 괄호( 와 닫는 괄호)는 모두 기능을 가지고 있습니다.(아래 표 참조.)
근데 저는 위 예시의 old_text에서 괄호와 그 속에 있는 모든 글자를 공백으로 바꾸고 싶습니다.
이런 경우 괄호 앞에 백슬래쉬를 2개 붙여서 여는 괄호와 닫는 괄호를 모두 escape 해줍니다.
사용 가능한 Pattern은 아래 표를 참고하면 됩니다.
(참고 : docs.aws.amazon.com/ko_kr/redshift/latest/dg/pattern-matching-conditions-posix.html)
| Sign | Description |
| . | 모든 문자를 일치시킵니다. |
| * | 0개 이상의 발생 패턴을 일치시킵니다. |
| + | 1개 이상의 발생 패턴을 일치시킵니다. |
| ? | 0개 또는 1개의 발생 패턴을 일치시킵니다. |
| | | 대체할 일치 패턴을 지정합니다. 예를 들어 E | H 는 E 또는 H를 의미합니다. |
| ^ | 라인 시작 문자를 일치시킵니다. |
| $ | 라인 끝 문자를 일치시킵니다. |
| $ | 문자열 끝을 일치시킵니다. |
| [ ] | 대괄호는 일치하는, 즉 목록의 표현식 1개와 일치해야 하는 목록을 지정합니다. 일치하지 않는, 즉 목록의 표현식을 제외한 모든 문자와 일치하는 목록 앞에는(^)이 입력됩니다. |
| ( ) | 그룹 항목을 괄호로 묶어 단일 논리 항목으로 처리합니다. |
| {m} | 이전 항목을 정확히 m번 반복합니다. |
| {m,} | 이전 항목을 m번 이상 반복합니다. |
| {m,n} | 이전 항목을 m번 이상, n번 미만 반복합니다. |
| [: :] | POSIX 문자 클래스 안에 있는 모든 문자를 일치시킵니다. 다음 문자 클래스에서 Amazon Redshift는 ASCII 문자만 지원합니다. [:alnum:], [:alpha:], [:lower:],[:upper:] |
| Operator | Description | Same operator |
| \\d | 숫자 문자 | [[:digit:]] |
| \\D | 숫자를 제외한 문자 | [^[:digit:]] |
| \\w | 단어 문자 | [[:word:]] |
| \\W | 단어를 제외한 문자 | [^[:word:]] |
| \\s | 공백 문자 | [[:space:]] |
| \\S | 공백을 제외한 문자 | [^[:space:]] |
'SQL > Redshift' 카테고리의 다른 글
| Redshift : position (문자열에서 특정 문자 위치 찾기) (0) | 2021.01.02 |
|---|---|
| Redshift : listagg (여러 행 데이터 합치기) (0) | 2020.12.23 |
| Redshift : TRUNC (소수점 버리기) (0) | 2020.12.17 |
| Redshift : CEIL, FLOOR (올림, 내림, 가장 크거나 작은 정수 반환) (0) | 2020.12.17 |
| Redshift : GREATEST, LEAST (여러 값 중 최대/최소값 return) (0) | 2020.12.17 |