๋ฌธ์์ด ํจ์(์ ๊ท์)ยถ
์ด๋ฌํ ๋ฌธ์์ด ํจ์๋ ์ ๊ท์(์ข ์ข โregexโ๋ผ๊ณ ๋ ํจ)๊ณผ ์ผ์นํ๋ ์์ ์ ์ํํฉ๋๋ค.
์ด ํญ๋ชฉ์ ๋ด์ฉ:
์ ๊ท์ ํจ์ ๋ชฉ๋กยถ
ํจ์ |
์ฐธ๊ณ |
---|---|
RLIKE์ ๋ณ์นญ์ ๋๋ค. |
|
REGEXP_SUBSTR_ALL์ ๋ณ์นญ์ ๋๋ค. |
|
RLIKE์ ๋ณ์นญ์ ๋๋ค. |
|
์ผ๋ฐ์ ์ธ ์ฌ์ฉ๋ฒ ๋ ธํธยถ
์ด ์ฐธ๊ณ ์ฌํญ์์ โ๋์โ์ ์์ ํ ๋ฌธ์์ด์ ์ง์นญํ๊ณ โํจํดโ์ ์ ๊ท์์ ์ง์นญํฉ๋๋ค.
๋์์ ์ผ๋ฐ์ ์ผ๋ก ๋ณ์ ์ด์ด๊ณ ํจํด์ ์ผ๋ฐ์ ์ผ๋ก ์์์ด์ง๋ง ํ์์ ์ธ ๊ฒ์ ์๋๋๋ค. ์ ๊ท์ ํจ์์ ๋ํ ๋ชจ๋ ์ธ์๋ ์์ ๋๋ ๋ณ์๊ฐ ๋ ์ ์์ต๋๋ค.
ํจํด์ ์ ์ฒด POSIX ERE(ํ์ฅ ์ ๊ท์) ๊ตฌ๋ฌธ์ ์ง์ํฉ๋๋ค. ์์ธํ ๋ด์ฉ์ (Wikipedia์์) POSIX ๊ธฐ๋ณธ ๋ฐ ํ์ฅ ์น์ ์ ์ฐธ์กฐํ์ญ์์ค.
ํจํด์ ๋ค์ Perl ๋ฐฑ์ฌ๋์ ์ํ์ค๋ ์ง์ํฉ๋๋ค.
\d
: 10์ง์(0~9).\D
: 10์ง์๊ฐ ์๋๋๋ค.\s
: ๊ณต๋ฐฑ ๋ฌธ์.\S
: ๊ณต๋ฐฑ ๋ฌธ์๊ฐ ์๋๋๋ค.\w
: โ๋จ์ดโ ๋ฌธ์(a~z, A~Z, ๋ฐ์ค(โ_โ) ๋๋ 10์ง์).\W
: ๋จ์ด ๋ฌธ์๊ฐ ์๋๋๋ค.\b
: ๋จ์ด ๊ฒฝ๊ณ์ .\B
: ๋จ์ด ๊ฒฝ๊ณ์ ์ด ์๋๋๋ค.
์์ธํ ๋ด์ฉ์ (Wikipedia์์) ๋ฌธ์ ํด๋์ค ์น์ ์ ์ฐธ์กฐํ๊ฑฐ๋ (Perl ์ค๋ช ์์์) ๋ฐฑ์ฌ๋์ ์ํ์ค ์น์ ์ ์ฐธ์กฐํ์ญ์์ค.
์ฐธ๊ณ
์์๋ฐ์ดํ๋ก ๋ฌถ์ธ ๋ฌธ์์ด ์์ ์์ ๋ฐฑ์ฌ๋์ ์ํ์ค์์ ๋ฐฑ์ฌ๋์ ๋ฌธ์๋ฅผ ์ด์ค์ผ์ดํํด์ผ ํฉ๋๋ค. ์๋ฅผ ๋ค์ด
\d
๋ฅผ ์ง์ ํ๋ ค๋ฉด\\d
๋ฅผ ์ฌ์ฉํ์ญ์์ค. ์์ธํ ๋ด์ฉ์ ์ด ํญ๋ชฉ์ ์์๋ฐ์ดํ๋ก ๋ฌถ์ธ ๋ฌธ์์ด ์์์์ ์ ๊ท์ ์ง์ ํ๊ธฐ ์น์ ์ ์ฐธ์กฐํ์ญ์์ค.๋ฌธ์์ด์ (์์๋ฐ์ดํ๊ฐ ์๋๋ผ) ๋ฌ๋ฌ ๊ธฐํธ ์($$) ์ผ๋ก ๊ตฌ๋ถํ๋ ๊ฒฝ์ฐ ๋ฐฑ์ฌ๋์๋ฅผ ์ด์ค์ผ์ดํํ์ง ์์๋ ๋ฉ๋๋ค.
๊ธฐ๋ณธ์ ์ผ๋ก, (ํจํด ๋ด์) POSIX ์์ผ๋์นด๋ ๋ฌธ์
.
๋ (๋์ ๋ด์) ์ค ๋ฐ๊ฟ ๋ฌธ์\n
๋ฅผ ์ผ์น ํญ๋ชฉ์ผ๋ก ํฌํจํ์ง ์์ต๋๋ค.๋ํ, ์ค ๋ฐ๊ฟ ๋ฌธ์์ ์ผ์น์ํค๋ ค๋ฉด
pattern
์ธ์์์.
์(.|\n)
์ผ๋ก ๋ฐ๊พธ๊ฑฐ๋ (์๋์์ ์ค๋ช ํ๋)parameters
์ธ์์s
๋งค๊ฐ ๋ณ์๋ฅผ ์ฌ์ฉํ์ญ์์ค.๋ชจ๋ ์ ๊ท์ ํจ์๋ ์ ๋์ฝ๋๋ฅผ ์ง์ํฉ๋๋ค. ๋จ์ผ ์ ๋์ฝ๋ ๋ฌธ์๋ ๊ทธ ๋ฌธ์์ ๋์ํ๋ ์ด์ง ํํ์ ๋ฐ์ดํธ ๊ธธ์ด์ ๊ด๊ณ์์ด ํญ์ ํ๋์ ๋ฌธ์๋ก ๊ณ์ฐ๋ฉ๋๋ค(์ฆ, POSIX ๋ฉํ ๋ฌธ์
.
์ ์ ํํ ํ๋์ ์ ๋์ฝ๋ ๋ฌธ์์ ์ผ์นํจ). ๋ํ, ๋์ ์คํ์ ์ ๋ฐ๊ฑฐ๋ ๋ฐํํ๋ ํจ์์ ๊ฒฝ์ฐ ๋จ์ผ ์ ๋์ฝ๋ ๋ฌธ์๋ 1๋ก ๊ณ์ฐ๋ฉ๋๋ค.
์ ๊ท์์ ๋งค๊ฐ ๋ณ์ ์ง์ ํ๊ธฐยถ
์ ๊ท์ ํจ์๋ ๋๋ถ๋ถ ์ ํ์ parameters
์ธ์๋ฅผ ์ง์ํฉ๋๋ค. parameters
์ธ์๋ ์ ๊ท์ ํจ์์ ์ผ์น ๋์์ ์ง์ ํ๋ VARCHAR ๋ฌธ์์ด์
๋๋ค. ๋ค์ ๋งค๊ฐ ๋ณ์๊ฐ ์ง์๋ฉ๋๋ค.
๋งค๊ฐ ๋ณ์ |
์ค๋ช |
---|---|
|
๋/์๋ฌธ์๋ฅผ ๊ตฌ๋ถํ๋ ์ผ์น๋ฅผ ํ์ฑํํฉ๋๋ค. |
|
๋/์๋ฌธ์๋ฅผ ๊ตฌ๋ถํ์ง ์๋ ์ผ์น๋ฅผ ํ์ฑํํฉ๋๋ค. |
|
์ฌ๋ฌ ์ค ๋ชจ๋๋ฅผ ํ์ฑํํฉ๋๋ค(์ฆ, ๋ฉํ ๋ฌธ์ |
|
ํ์ ์ผ์น ํญ๋ชฉ์ ์ถ์ถํ๋ฉฐ, REGEXP_INSTR, REGEXP_SUBSTR, REGEXP_SUBSTR_ALL ๋ฐ ์ด๋ค ํจ์์ ๋ณ์นญ์๋ง ์ ์ฉ๋ฉ๋๋ค. |
|
|
๊ธฐ๋ณธ ๋ฌธ์์ด์ c
๋ก, ๋ค์์ ์ง์ ํฉ๋๋ค.
๋/์๋ฌธ์๋ฅผ ๊ตฌ๋ถํ๋ ์ผ์น์ ๋๋ค.
ํ ์ค ๋ชจ๋.
ํญ์ ํ์ ์ผ์น ์ถ์ถ์ ์ฌ์ฉํ๋ REGEXP_REPLACE ๋ฅผ ์ ์ธํ๋ฉด ํ์ ์ผ์น ์ถ์ถ์ด ์์ต๋๋ค.
POSIX ์์ผ๋์นด๋ ๋ฌธ์
.
์\n
์ค ๋ฐ๊ฟ ๋ฌธ์์ ์ผ์นํ์ง ์์ต๋๋ค.
์ฌ๋ฌ ๋งค๊ฐ ๋ณ์๋ฅผ ์ง์ ํ ๋ ๊ณต๋ฐฑ์ด๋ ๊ตฌ๋ถ ๊ธฐํธ ์์ด ๋ฌธ์์ด์ ์
๋ ฅํฉ๋๋ค. ์๋ฅผ ๋ค์ด, ims
๋ POSIX ์์ผ๋์นด๋ ์ผ์น๋ฅผ ์ฌ์ฉํ์ฌ ์ฌ๋ฌ ์ค ๋ชจ๋์์ ๋/์๋ฌธ์๋ฅผ ๊ตฌ๋ถํ์ง ์๋ ์ผ์น๋ฅผ ์ง์ ํฉ๋๋ค.
c
์ i
๊ฐ ๋ ๋ค parameters
๋ฌธ์์ด์ ํฌํจ๋ ๊ฒฝ์ฐ, ๋ฌธ์์ด์์ ๋ง์ง๋ง์ ๋ํ๋๋ ์ฝ๋์ ๋ฐ๋ผ ํจ์๊ฐ ๋/์๋ฌธ์๋ฅผ ๊ตฌ๋ถํ๋ ์ผ์น ๋๋ ๋/์๋ฌธ์๋ฅผ ๊ตฌ๋ถํ์ง ์๋ ์ผ์น๋ฅผ ์ํํ๋์ง ์ฌ๋ถ๊ฐ ๊ฒฐ์ ๋ฉ๋๋ค. ์๋ฅผ ๋ค์ด, ci
๋ i
๊ฐ ๋ฌธ์์ด์ ๋ง์ง๋ง์ ๋์ค๋ฏ๋ก ๋/์๋ฌธ์๋ฅผ ๊ตฌ๋ถํ์ง ์๋ ์ผ์น๋ฅผ ์ง์ ํฉ๋๋ค.
๋ค์ ์์์๋ ๋/์๋ฌธ์๋ฅผ ๊ตฌ๋ถํ๋ ์ผ์น์ ๋/์๋ฌธ์๋ฅผ ๊ตฌ๋ถํ์ง ์๋ ์ผ์น์ ๋ฐ๋ผ ๊ฒฐ๊ณผ๊ฐ ์ด๋ป๊ฒ ๋ฌ๋ผ์ง ์ ์๋์ง ๋ณด์ฌ์ค๋๋ค. REGEXP_COUNT ํจ์๋ ๋/์๋ฌธ์ ๊ตฌ๋ถ ์ผ์น(c
๋งค๊ฐ ๋ณ์, ๊ธฐ๋ณธ๊ฐ)์ ๊ฒฝ์ฐ snow
๋ฐ SNOW
์ ๋ํ ์ผ์น ํญ๋ชฉ์ ๋ฐํํ์ง ์๊ณ ๋/์๋ฌธ์๋ฅผ ๊ตฌ๋ถํ์ง ์๋ ์ผ์น(i
๋งค๊ฐ ๋ณ์)์ ๊ฒฝ์ฐ ํ๋์ ์ผ์น ํญ๋ชฉ์ ๋ฐํํฉ๋๋ค.
SELECT REGEXP_COUNT('snow', 'SNOW', 1, 'c') AS case_sensitive_matching,
REGEXP_COUNT('snow', 'SNOW', 1, 'i') AS case_insensitive_matching;
+-------------------------+---------------------------+
| CASE_SENSITIVE_MATCHING | CASE_INSENSITIVE_MATCHING |
|-------------------------+---------------------------|
| 0 | 1 |
+-------------------------+---------------------------+
e
๋งค๊ฐ ๋ณ์์ ํจ๊ป REGEXP_SUBSTR ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ๋จ์ด Release
๋ค์ ๋จ์ด๊ฐ ์๋ ๋ฌธ์๊ฐ ํ๋ ์ด์ ๋์ค๊ณ ๊ทธ ๋ค์ ์ซ์๊ฐ ํ๋ ์ด์ ๋์ค๋ ํญ๋ชฉ์ ์ฐพ์ ๋ค์ ์ซ์์ ์ผ์นํ๋ ํ์ ๋ฌธ์์ด์ ๋ฐํํฉ๋๋ค.
SELECT REGEXP_SUBSTR('Release 24', 'Release\\W+(\\d+)', 1, 1, 'e') AS release_number;
+----------------+
| RELEASE_NUMBER |
|----------------|
| 24 |
+----------------+
๋งค๊ฐ ๋ณ์๋ฅผ ์ฌ์ฉํ๋ ์๋ฅผ ๋ ๋ง์ด ๋ณด๋ ค๋ฉด REGEXP_INSTR, REGEXP_LIKE, REGEXP_SUBSTR, REGEXP_SUBSTR_ALL ๋ฐ [ NOT ] RLIKE ์น์ ์ ์ฐธ์กฐํ์ญ์์ค.
๋ฉํ ๋ฌธ์์ธ ์ผ์นํ๋ ๋ฌธ์ยถ
์ ๊ท์์์๋ ์ผ๋ถ ๋ฌธ์๊ฐ ํน์ ํ ์๋ฏธ๋ฅผ ๊ฐ์ง ๋ฉํ ๋ฌธ์๋ก ์ฒ๋ฆฌ๋ฉ๋๋ค. ์:
.
๋ ์์์ ๋จ์ผ ๋ฌธ์์ ์ผ์นํ๋ ๋ฉํ ๋ฌธ์ ์ ๋๋ค.*
๋ 0๊ฐ ๋๋ ๊ทธ ์ด์์ ์ ํ ์์ ์ธ์คํด์ค์ ์ผ์นํ๋ ์๋์ ์ ๋๋ค. ์๋ฅผ ๋ค์ดBA*
๋B
,BA
,BAA
๋ฑ๊ณผ ์ผ์นํฉ๋๋ค.?
๋ 0๊ฐ ๋๋ ํ ๊ฐ์ ์ ํ ์์ ์ธ์คํด์ค์ ์ผ์นํ๋ ์๋์์ ๋๋ค.
์ค์ ๋ฌธ์(์: ์ค์ ๋ง์นจํ, ๋ณํ ๋๋ ๋ฌผ์ํ)์ ์ผ์น์ํค๋ ค๋ฉด ๋ฐฑ์ฌ๋์(์: \.
, \*
, \?
๋ฑ)๋ก ๋ฉํ ๋ฌธ์๋ฅผ ์ด์ค์ผ์ดํํด์ผ ํฉ๋๋ค.
์ฐธ๊ณ
์์๋ฐ์ดํ๋ก ๋ฌถ์ธ ๋ฌธ์์ด ์์ ์์ ์ ๊ท์์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ๋ฐฑ์ฌ๋์๋ฅผ ๋ ๋ค๋ฅธ ๋ฐฑ์ฌ๋์(์: \\.
, \\*
, \\?
๋ฑ)๋ก ์ด์ค์ผ์ดํํด์ผ ํฉ๋๋ค. ์์ธํ ๋ด์ฉ์ ์์๋ฐ์ดํ๋ก ๋ฌถ์ธ ๋ฌธ์์ด ์์์์ ์ ๊ท์ ์ง์ ํ๊ธฐ ์น์
์ ์ฐธ์กฐํ์ญ์์ค.
์๋ฅผ ๋ค์ด ๋ฌธ์์ด์์ ์ฌ๋ ๊ดํธ((
)๋ฅผ ์ฐพ์์ผ ํ๋ค๊ณ ๊ฐ์ ํ๊ฒ ์ต๋๋ค. ์ด๋ฅผ ์ง์ ํ๋ ํ ๊ฐ์ง ๋ฐฉ๋ฒ์ ๋ฐฑ์ฌ๋์๋ฅผ ์ฌ์ฉํ์ฌ ํจํด์์ ๋ฌธ์(์: \(
)๋ฅผ ์ด์ค์ผ์ดํํ๋ ๊ฒ์
๋๋ค.
ํจํด์ ์์๋ฐ์ดํ๋ก ๋ฌถ์ธ ๋ฌธ์์ด ์์ ๋ก ์ง์ ํ๋ ๊ฒฝ์ฐ์๋ ๊ทธ ๋ฐฑ์ฌ๋์๋ฅผ ๋ ๋ค๋ฅธ ๋ฐฑ์ฌ๋์๋ก ์ด์ค์ผ์ดํ ํด์ผ ํฉ๋๋ค.
๋ค์ ํจํด์ ๊ดํธ ์์ ๋ํ๋๋ ์์ซ์ ์ํ์ค์ ์ผ์นํฉ๋๋ค(์: (NY)
).
SELECT REGEXP_SUBSTR('Customers - (NY)','\\([[:alnum:]]+\\)') AS location;
+----------+
| LOCATION |
|----------|
| (NY) |
+----------+
์ถ๊ฐ์ ์ธ ์๋ฅผ ๋ณด๋ ค๋ฉด ์์๋ฐ์ดํ๋ก ๋ฌถ์ธ ๋ฌธ์์ด ์์์์ ๋ฉํ ๋ฌธ์๋ฅผ ์ฌ์ฉํ๋ ์ ์น์ ์ ์ฐธ์กฐํ์ญ์์ค.
๋ฌ๋ฌ ๊ธฐํธ๋ก ๋ฌถ์ธ ๋ฌธ์์ด ์์ ๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ๋ฐฑ์ฌ๋์ ๋ฌธ์๋ฅผ ์ด์ค์ผ์ดํํ ํ์๊ฐ ์์ต๋๋ค.
SELECT REGEXP_SUBSTR('Customers - (NY)',$$\([[:alnum:]]+\)$$) AS location;
+----------+
| LOCATION |
|----------|
| (NY) |
+----------+
์ญ์ฐธ์กฐ ์ฌ์ฉํ๊ธฐยถ
Snowflake๋ ์ ๊ท์ ํจํด์์ ์ญ์ฐธ์กฐ(ํ์ ์ธ์ด ์ด๋ก ์์๋ โ์คํ์ดโ๋ก ์๋ ค์ง)๋ฅผ ์ง์ํ์ง ์์ต๋๋ค. ํ์ง๋ง ์ญ์ฐธ์กฐ๋ REGEXP_REPLACE ํจ์์ ๋์ฒด ๋ฌธ์์ด์์ ์ง์๋ฉ๋๋ค.
๋น ํจํด ์ง์ ํ๊ธฐยถ
๋๋ถ๋ถ์ regexp ํจ์์์ ๋น ํจํด(์ฆ, ''
)์ ๋ฌด์๊ณผ๋ ์ผ์นํ์ง ์๋๋ฐ, ์ฌ์ง์ด ๋น ๋์๊ณผ๋ ์ผ์นํ์ง ์์ต๋๋ค.
์์ธ๋ REGEXP_LIKE ์ ๊ทธ ๋ณ์นญ์ธ [ NOT ] REGEXP ๋ฐ [ NOT ] RLIKE ๋ก, ์ฌ๊ธฐ์ ํจํด์ ์์ชฝ ๋์ ์์์ ์ผ๋ก ๊ณ ์ ๋๋ฏ๋ก ๋น ํจํด์ด ๋น ์ฃผ๋์๊ณผ ์ผ์นํฉ๋๋ค(์ฆ, ''
๊ฐ ์๋์ผ๋ก '^$'
๊ฐ ๋จ).
๋น ๊ทธ๋ฃน(์ฆ, ํ์ ์ ()
)์ ๋์์ ์์๊ณผ ๋์ ํฌํจํ์ฌ, ๋ฌธ์ ์ฌ์ด์ ๊ณต๋ฐฑ๊ณผ ์ผ์นํฉ๋๋ค.
๋ฌ๋ฌ ๊ธฐํธ๋ก ๋ฌถ์ธ ๋ฌธ์์ด ์์์์ ์ ๊ท์ ์ง์ ํ๊ธฐยถ
๋ฌธ์์ด ์์๋ฅผ ์ฌ์ฉํ์ฌ ํจ์์ ์ ๊ท์์ ์ง์ ํ๋ ๊ฒฝ์ฐ ๋ฌ๋ฌ ๊ธฐํธ๋ก ๋ฌถ์ธ ๋ฌธ์์ด ์์ ๋ฅผ ์ฌ์ฉํ์ฌ ์ ๊ท์์์ ๋ฐฑ์ฌ๋์ ๋ฌธ์๋ฅผ ์ด์ค์ผ์ดํ ํ์ง ๋ชปํ๋๋ก ํ ์ ์์ต๋๋ค. (์์๋ฐ์ดํ๋ก ๋ฌถ์ธ ๋ฌธ์์ด ์์ ๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ๋ฐฑ์ฌ๋์๋ฅผ ์ด์ค์ผ์ดํํด์ผ ํฉ๋๋ค.)
๋ฌ๋ฌ ๊ธฐํธ๋ก ๋ฌถ์ธ ๋ฌธ์์ด ์์์ ๋ด์ฉ์ ํญ์ ๋ฌธ์ ๊ทธ๋๋ก ํด์๋ฉ๋๋ค.
์๋ฅผ ๋ค์ด ๋ฉํ ๋ฌธ์ ๋ฅผ ์ด์ค์ผ์ดํํ ๋๋ ๋จ์ผ ๋ฐฑ์ฌ๋์๋ง ์ฌ์ฉํด์ผ ํฉ๋๋ค.
SELECT w2
FROM wildcards
WHERE REGEXP_LIKE(w2, $$\?$$);
์ญ์ฐธ์กฐ ๋ฅผ ์ฌ์ฉํ ๋๋ ๋จ์ผ ๋ฐฑ์ฌ๋์๋ง ์ฌ์ฉํ๋ฉด ๋ฉ๋๋ค.
SELECT w2, REGEXP_REPLACE(w2, '(.old)', $$very \1$$)
FROM wildcards
ORDER BY w2;
์์๋ฐ์ดํ๋ก ๋ฌถ์ธ ๋ฌธ์์ด ์์์์ ์ ๊ท์ ์ง์ ํ๊ธฐยถ
์์๋ฐ์ดํ๋ก ๋ฌถ์ธ ๋ฌธ์์ด ์์ ์์ ์ ๊ท์์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ๋ฐฑ์ฌ๋์ ์ํ์ค ์ ๋ชจ๋ ๋ฐฑ์ฌ๋์๋ฅผ ๋ ๋ค๋ฅธ ๋ฐฑ์ฌ๋์๋ก ์ด์ค์ผ์ดํํด์ผ ํฉ๋๋ค.
์ฐธ๊ณ
์ ๊ท์์์ ๋ฐฑ์ฌ๋์ ์ด์ค์ผ์ดํ๋ฅผ ๋ฐฉ์งํ๋ ค๋ฉด ์์๋ฐ์ดํ๋ก ๋ฌถ์ธ ๋ฌธ์์ด ์์๊ฐ ์๋๋ผ ๋ฌ๋ฌ ๊ธฐํธ๋ก ๋ฌถ์ธ ๋ฌธ์์ด ์์ ๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
์:
๋ฐฑ์ฌ๋์๋ก ๋ฉํ ๋ฌธ์๋ฅผ ์ด์ค์ผ์ดํ ํ๋ ๊ฒฝ์ฐ ๋ฐฑ์ฌ๋์๋ฅผ ๋ ๋ค๋ฅธ ๋ฐฑ์ฌ๋์๋ก ์ด์ค์ผ์ดํํด์ผ ํฉ๋๋ค. ์์๋ฐ์ดํ๋ก ๋ฌถ์ธ ๋ฌธ์์ด ์์์์ ๋ฉํ ๋ฌธ์๋ฅผ ์ฌ์ฉํ๋ ์ ์น์ ์ ์ฐธ์กฐํ์ญ์์ค.
๋ฐฑ์ฌ๋์ ์ํ์ค ๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ์ํ์ค์์ ๋ฐฑ์ฌ๋์๋ฅผ ์ด์ค์ผ์ดํํด์ผ ํฉ๋๋ค.
์ญ์ฐธ์กฐ ๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ์ญ์ฐธ์กฐ์์ ๋ฐฑ์ฌ๋์๋ฅผ ์ด์ค์ผ์ดํํด์ผ ํฉ๋๋ค. ์์๋ฐ์ดํ๋ก ๋ฌถ์ธ ๋ฌธ์์ด ์์์์ ์ญ์ฐธ์กฐ๋ฅผ ์ฌ์ฉํ๋ ์ ์น์ ์ ์ฐธ์กฐํ์ญ์์ค.
์์๋ฐ์ดํ๋ก ๋ฌถ์ธ ๋ฌธ์์ด ์์์์ ๋ฉํ ๋ฌธ์๋ฅผ ์ฌ์ฉํ๋ ์ยถ
์ด ์์์๋ ๋ฌผ์ํ(?
)๋ฅผ ๊ฒ์ํ๋ ์ ๊ท์์์ ์ด์ค์ผ์ดํ ์ํ์ค์ ์ผ๋ถ๋ก์ ๋ฐฑ์ฌ๋์๋ฅผ ์ฌ์ฉํฉ๋๋ค.
ํ ์ด๋ธ์ ๋ง๋ค๊ณ ํ ์ด์ ๋จ์ผ ๋ฐฑ์ฌ๋์๋ฅผ ํฌํจํ๊ณ ๋ค๋ฅธ ์ด์๋ ๋ฌผ์ํ๊ฐ ํฌํจ๋ ํ์ ์ฝ์ ํฉ๋๋ค.
CREATE OR REPLACE TABLE wildcards (w VARCHAR, w2 VARCHAR);
INSERT INTO wildcards (w, w2) VALUES ('\\', '?');
๋ค์ ์ฟผ๋ฆฌ๋ ๋ฌผ์ํ ๋ฆฌํฐ๋ด์ ๊ฒ์ํฉ๋๋ค. ๊ฒ์์ ์ ๊ท์์ ์ฌ์ฉํ๊ณ ๋ฌผ์ํ๋ ์ ๊ท์์ ๋ฉํ ๋ฌธ์์ด๋ฏ๋ก ๋ฆฌํฐ๋ด๋ก ์ฒ๋ฆฌํ๋ ค๋ฉด ๋ฌผ์ํ๋ฅผ ์ด์ค์ผ์ดํํด์ผ ํฉ๋๋ค. ๋ฐฑ์ฌ๋์๋ ๋ฌธ์์ด ๋ฆฌํฐ๋ด๋ก ๋ํ๋๊ธฐ ๋๋ฌธ์ ๋ฐฑ์ฌ๋์ ์์ฒด๋ ์ด์ค์ผ์ดํํด์ผ ํฉ๋๋ค.
SELECT w2
FROM wildcards
WHERE REGEXP_LIKE(w2, '\\?');
+----+
| W2 |
|----|
| ? |
+----+
๋ค์ ์ฟผ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ฉด ์ ๊ท์์ด ๋ ๊ฐ์ ๋ฌธ์(๋ฐฑ์ฌ๋์ ์ด์ค์ผ์ดํ ๋ฌธ์ ๋ฐ ๋ฌผ์ํ)๋ก ๊ตฌ์ฑ๋์ด ์์์ ๋ ์ฝ๊ฒ ํ์ธํ ์ ์์ต๋๋ค.
SELECT w2
FROM wildcards
WHERE REGEXP_LIKE(w2, '\\' || '?');
+----+
| W2 |
|----|
| ? |
+----+
์ด์ ์์์ ์ถ๊ฐ ๋ฐฑ์ฌ๋์๋ ์ด์ค์ผ์ดํ ๋ฌธ์๊ฐ ๋ฌธ์์ด ๋ฆฌํฐ๋ด์ ์ผ๋ถ ์๊ธฐ ๋๋ฌธ์ ํ์ํ์ต๋๋ค. ์ ๊ท์ ์์ฒด์๋ ํ์ํ์ง ์์์ต๋๋ค. ๋ค์ SELECT ๋ฌธ์ ๋ฌธ์์ด ๋ฆฌํฐ๋ด์ SQL ๋ช ๋ น ๋ฌธ์์ด์ ์ผ๋ถ๋ก์ ๊ตฌ๋ฌธ ๋ถ์ํ ํ์๊ฐ ์์ผ๋ฏ๋ก, ๋ฌธ์์ด ๋ฆฌํฐ๋ด์ ํ์ํ ์ถ๊ฐ ์ด์ค์ผ์ดํ ๋ฌธ์๊ฐ ํ์ํ์ง ์์ต๋๋ค.
SELECT w, w2, w || w2 AS escape_sequence, w2
FROM wildcards
WHERE REGEXP_LIKE(w2, w || w2);
+---+----+-----------------+----+
| W | W2 | ESCAPE_SEQUENCE | W2 |
|---+----+-----------------+----|
| \ | ? | \? | ? |
+---+----+-----------------+----+
์์๋ฐ์ดํ๋ก ๋ฌถ์ธ ๋ฌธ์์ด ์์์์ ์ญ์ฐธ์กฐ๋ฅผ ์ฌ์ฉํ๋ ์ยถ
๋ฌธ์์ด ๋ฆฌํฐ๋ด์์ ์ญ์ฐธ์กฐ (์: \1
)๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ํด๋น ์ญ์ฐธ์กฐ์ ์ผ๋ถ์ธ ์ญ์ฌ๋์๋ฅผ ์ด์ค์ผ์ดํํด์ผ ํฉ๋๋ค. ์๋ฅผ ๋ค์ด REGEXP_REPLACE ์ ๋์ฒด ๋ฌธ์์ด ๋ฆฌํฐ๋ด์์ ์ญ์ฐธ์กฐ \1
์ ์ง์ ํ๋ ค๋ฉด \\1
์ ์ฌ์ฉํฉ๋๋ค.
๋ค์ ์์์๋ ์์์ ๋ง๋ ํ
์ด๋ธ์ ์ฌ์ฉํฉ๋๋ค. SELECT๋ ์ญ์ฐธ์กฐ๋ฅผ ์ฌ์ฉํ์ฌ ์ ๊ท์ .old
์ ๊ฐ ๋ฐ์์ ์ผ์นํ๋ ๋ฌธ์์ด์ ๋ณต์ฌ๋ณธ์ผ๋ก ๋ฐ๊ฟ ๊ทธ ์์ โveryโ๋ผ๋ ๋จ์ด๋ฅผ ๋ถ์
๋๋ค.
INSERT INTO wildcards (w, w2) VALUES (NULL, 'When I am cold, I am bold.');
SELECT w2, REGEXP_REPLACE(w2, '(.old)', 'very \\1')
FROM wildcards
ORDER BY w2;
+----------------------------+------------------------------------------+
| W2 | REGEXP_REPLACE(W2, '(.OLD)', 'VERY \\1') |
|----------------------------+------------------------------------------|
| ? | ? |
| When I am cold, I am bold. | When I am very cold, I am very bold. |
+----------------------------+------------------------------------------+