일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- Excel
- string
- array
- Github
- c#
- dataframe
- numpy
- Tkinter
- GIT
- gas
- Kotlin
- list
- hive
- Redshift
- google apps script
- PANDAS
- Google Spreadsheet
- Google Excel
- SQL
- Apache
- math
- django
- Java
- PostgreSQL
- matplotlib
- PySpark
- 파이썬
- Python
- Mac
- 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 |