POSITION
POSITION
POSITION 함수는 두 번째 인자에서 첫 번째 인자의 첫 번째 출현 위치를 검색하고, 찾으면 두 번째 인자에서 첫 번째 인자의 위치(1부터 시작)를 반환해요.
첫 번째 출현 이후의 위치를 찾아야 한다면(예: 세 번째 출현), REGEXP_INSTR 함수를 사용할 수 있어요.
별칭(Aliases): CHARINDEX — 단, CHARINDEX 함수는 POSITION이 지원하는 구문 변형 중 하나를 지원하지 않아요.
출처: 문서
본문
문법 (Syntax)
POSITION( <expr1>, <expr2> [ , <start_pos> ] )
POSITION( <expr1> IN <expr2> )
인자 (Arguments)
필수 (Required):
- expr1 — 찾으려는 값을 나타내는 문자열 또는 이진(binary) 표현식이에요.
- expr2 — 검색할 값을 나타내는 문자열 또는 이진 표현식이에요.
선택 (Optional):
- start_pos — 검색을 시작할 위치를 나타내는 숫자예요 (1은 expr2의 시작을 나타내요). 기본값: 1
반환 (Returns)
이 함수는 NUMBER 타입의 값을 반환해요. 인자 중 하나라도 NULL이면 함수는 NULL을 반환해요.
사용 메모 (Usage notes)
- 문자열 또는 이진 값을 찾지 못하면 함수는 0을 반환해요.
- 지정한 선택적 start_pos가 두 번째 인자(검색할 문자열)의 끝을 넘어서면 함수는 0을 반환해요.
- 첫 번째 인자가 비어 있으면(예: 빈 문자열) 함수는 1을 반환해요.
- 처음 두 인자의 데이터 타입은 동일해야 해요 (둘 다 문자열 또는 둘 다 이진 값).
대조(collation) 세부사항
이 함수는 다음 대조 지정을 지원하지 않아요:
- pi (punctuation-insensitive, 구두점 무시).
- cs-ai (case-sensitive, accent-insensitive, 대소문자 구분·발음 구별 부호 무시).
예제 (Examples)
다음 예제들은 POSITION 함수를 사용해요.
VARCHAR 표현식
‘banana’에서 ‘an’의 첫 번째 출현 위치를 찾아요:
SELECT POSITION('an', 'banana', 1);
+-----------------------------+
| POSITION('AN', 'BANANA', 1) |
|-----------------------------|
| 2 |
+-----------------------------+
‘banana’에서 위치 3 이후의 ‘an’의 첫 번째 출현 위치를 찾아요. 이 검색은 ‘an’의 두 번째 출현을 찾아요.
SELECT POSITION('an', 'banana', 3);
+-----------------------------+
| POSITION('AN', 'BANANA', 3) |
|-----------------------------|
| 4 |
+-----------------------------+
유니코드 문자를 포함한 다양한 문자를 문자열에서 검색해요:
SELECT n, h, POSITION(n IN h) FROM pos;
+--------+---------------------+------------------+
| N | H | POSITION(N IN H) |
|--------+---------------------+------------------|
| | | 1 |
| | sth | 1 |
| 43 | 41424344 | 5 |
| a | NULL | NULL |
| dog | catalog | 0 |
| log | catalog | 5 |
| lésine | le péché, la lésine | 14 |
| nicht | Ich weiß nicht | 10 |
| sth | | 0 |
| ☃c | ☃a☃b☃c☃d | 5 |
| ☃☃ | bunch of ☃☃☃☃ | 10 |
| ❄c | ❄a☃c❄c☃ | 5 |
| NULL | a | NULL |
| NULL | NULL | NULL |
+--------+---------------------+------------------+
BINARY 표현식
아래 값들은 16진수 표현이므로, BINARY 바이트 하나는 16진수 두 자리로 나타내져요.
이 예제에서 반환 값은 3이에요. ‘EF’가 3번째 바이트와 일치하기 때문이에요 (첫 번째 바이트는 ‘AB’, 두 번째 바이트는 ‘CD’, 세 번째 바이트는 ‘EF’):
SELECT POSITION(X'EF', X'ABCDEF');
+----------------------------+
| POSITION(X'EF', X'ABCDEF') |
|----------------------------|
| 3 |
+----------------------------+
이 예제에서는 일치하는 게 없어요. ‘BC’ 시퀀스가 검색되는 값 안에 있는 것처럼 보이지만, ‘B’는 첫 번째 바이트의 두 번째 니블(nibble)이고, ‘C’는 두 번째 바이트의 첫 번째 니블이에요. 실제로 ‘BC’를 포함하는 바이트가 없으므로 반환 값은 0(찾지 못함)이에요.
SELECT POSITION(X'BC', X'ABCD');
+--------------------------+
| POSITION(X'BC', X'ABCD') |
|--------------------------|
| 0 |
+--------------------------+