{#string-string-functions} # 문자열 함수 텍스트에 대한 함수들입니다. 속성은 `jsonb`로 들어오고, 이 함수 중 몇 개는 `text` 오버로드와 `jsonb` 오버로드를 모두 갖고 있습니다. 파서가 어느 것을 고르는지는 무엇을 넘기는지에 달려 있으므로, 리터럴과 속성이 항상 같게 동작하지는 않습니다. 그것이 문제가 되는 항목마다 그 사실을 적어 두었습니다. 예제는 [예제 데이터셋](../../get_started/example-dataset.md)에서 실행됩니다. {#string-left} ## left ``` left ( string jsonb, n jsonb ) -> jsonb left ( string text, n integer ) -> text ``` 문자열의 앞 `n`글자를 반환합니다. **고려할 점** - 속성에 정수 리터럴을 함께 주면 **모호합니다.** `left(jsonb, jsonb)`와 `left(text, integer)`가 똑같이 잘 맞기 때문입니다: ```cypher MATCH (m:movie {title:'Blade Runner 2049'}) RETURN left(m.title, 12); ``` ``` ERROR: function left(jsonb, integer) is not unique LINE 1: ...ATCH (m:movie {title:'Blade Runner 2049'}) RETURN left(m.tit... ^ HINT: Could not choose a best candidate function. You might need to add explicit type casts. ``` `left(m.title::text, 12)`처럼 문자열을 형 변환하거나, 그런 충돌이 없는 [`substring`](#string-substring)을 쓰십시오. - `n`이 문자열보다 크면 문자열 전체를 반환합니다. ```cypher MATCH (m:movie {title:'Blade Runner 2049'}) RETURN left(m.title::text, 12) AS head, right(m.title::text, 4) AS tail; ``` ``` head | tail ----------------+-------- "Blade Runner" | "2049" ``` {#string-lower} ## lower ``` lower ( string text ) -> text ``` 문자열을 소문자로 반환합니다. PostgreSQL 자신의 함수이고, `jsonb` 문자열이 `text`로 변환되기 때문에 Cypher에서 닿을 수 있습니다. [`toLower`](#string-tolower)가 Cypher 쪽 표기이고 `jsonb`를 곧바로 받습니다. ```cypher RETURN lower('AbCdeFG') AS lower, upper('AbCdeFG') AS upper; ``` ``` lower | upper -----------+----------- "abcdefg" | "ABCDEFG" ``` {#string-ltrim} ## lTrim ``` lTrim ( string jsonb ) -> jsonb ``` 문자열 앞쪽의 공백을 제거합니다. **고려할 점** - 공백만 제거합니다. 제거할 문자 집합을 받는 형태는 없습니다. 그것이 필요하면 PostgreSQL의 `ltrim(text, text)`을 쓰십시오. ```cypher RETURN lTrim(' ABCD ') AS l, rTrim(' ABCD ') AS r, trim(' ABCD ') AS both; ``` ``` l | r | both ------------+------------+-------- "ABCD " | " ABCD" | "ABCD" ``` {#string-replace} ## replace ``` replace ( string jsonb, old jsonb, new jsonb ) -> jsonb ``` 어떤 부분 문자열이 나타나는 모든 곳을 다른 문자열로 바꿉니다. | 이름 | 타입 | 설명 | | --- | --- | --- | | `string` | `jsonb` | 검색할 문자열입니다. | | `old` | `jsonb` | 찾을 부분 문자열입니다. 첫 번째만이 아니라 나타나는 모든 곳이 바뀝니다. | | `new` | `jsonb` | 바꿔 넣을 문자열입니다. `old`보다 길거나 짧아도 되고, 빈 문자열도 됩니다. | **고려할 점** - `old`와 `new`의 길이가 같아야 하는 것은 아닙니다. - 나타나지 않는 `old`를 주면 문자열이 그대로 반환됩니다. ```cypher MATCH (m:movie {title:'Terminator 2: Judgment Day'}) RETURN replace(m.title, 'Judgment', 'Judgement') AS british; ``` ``` british ------------------------------- "Terminator 2: Judgement Day" ``` {#string-reverse} ## reverse ``` reverse ( string text ) -> text reverse ( list jsonb ) -> jsonb reverse ( list anyarray ) -> anyarray ``` 문자열이나 리스트를 뒤집습니다. **고려할 점** - 어느 오버로드를 받는지는 인자에 달려 있고, 그 둘은 문자열에 대해 서로 다르게 굽니다. 문자열 *리터럴*은 `reverse(text)`로 해석되어 뒤집힙니다. 문자열 *속성*은 이미 `jsonb`이므로 `reverse(jsonb)`로 해석되는데, 그것은 배열만 뒤집습니다: ```cypher RETURN reverse('Blade Runner 2049'::jsonb); ``` ``` ERROR: reverse(): list is expected but "Blade Runner 2049" ``` 속성 참조는 이미 `jsonb`이므로 그 형 변환과 같게 동작합니다. 글자를 뒤집으려면 반대로 형 변환을 하십시오. `reverse(m.title::text)`입니다. - 리스트 속성에는 형 변환이 필요하지 않습니다. `jsonb` 오버로드가 리스트를 뒤집습니다. ```cypher RETURN reverse('ABCDEFG') AS text, reverse([1,2,3]) AS list; ``` ``` text | list -----------+----------- "GFEDCBA" | [3, 2, 1] ``` ```cypher MATCH (m:movie {title:'Blade Runner 2049'}) RETURN reverse(m.title::text) AS backwards; ``` ``` backwards --------------------- "9402 rennuR edalB" ``` {#string-right} ## right ``` right ( string jsonb, n jsonb ) -> jsonb right ( string text, n integer ) -> text ``` 문자열의 뒤 `n`글자를 반환합니다. 속성에 정수 리터럴을 함께 줄 때의 모호함을 [`left`](#string-left)와 공유하며, 그것을 푸는 두 방법도 같습니다. {#string-rtrim} ## rTrim ``` rTrim ( string jsonb ) -> jsonb ``` 문자열 뒤쪽의 공백을 제거합니다. 실제 예제는 [`lTrim`](#string-ltrim)을 참고하십시오. {#string-split} ## split ``` split ( string text, delimiter text ) -> anyarray ``` 구분자가 나타나는 모든 곳에서 문자열을 잘라 리스트로 만듭니다. **고려할 점** - 그 값은 문자열의 배열입니다. 카탈로그가 반환 타입을 `anyarray`로 선언하므로 SQL에서 `pg_typeof`가 `anyarray`로 보고합니다. Cypher의 `RETURN`은 그것을 `jsonb` 리스트로 감쌉니다. - 나타나지 않는 구분자를 주면 문자열 전체를 담은 요소 하나짜리 리스트가 반환됩니다. - 구분자는 패턴이 아니라 리터럴 문자열입니다. 정규 표현식이 필요하면 PostgreSQL의 `regexp_split_to_array`를 쓰십시오. ```cypher RETURN split('Action/Sci-Fi/Drama', '/') AS genres; ``` ``` genres ------------------------------- ["Action", "Sci-Fi", "Drama"] ``` {#string-str_size} ## str_size ``` str_size ( string text ) -> integer ``` 문자열의 글자 수를 `integer`로 반환합니다. **고려할 점** - [`size`](#scalar-size)와 [`length`](#scalar-length)가 Cypher 쪽 표기이고 `jsonb`를 반환합니다. 이 함수는 네이티브 `integer`를 원하는 호출자가 그것을 벗겨 내지 않아도 되게 하려고 있습니다. 드라이버, 또는 Cypher 쿼리를 감싸는 SQL이 그런 호출자입니다. ```cypher RETURN str_size('hello') AS n; ``` ``` n --- 5 ``` {#string-substring} ## substring ``` substring ( string jsonb, start jsonb ) -> jsonb substring ( string jsonb, start jsonb, count jsonb ) -> jsonb ``` 문자열의 일부를 반환하며, `start`에서 시작해 끝까지 또는 `count`글자만큼 이어집니다. | 이름 | 타입 | 설명 | | --- | --- | --- | | `string` | `jsonb` | 자를 문자열입니다. | | `start` | `jsonb` | 첫 글자의 위치이며 0부터 셉니다. | | `count` | `jsonb` | 취할 글자 수입니다. 생략하면 문자열의 나머지 전부입니다. 끝을 넘어가는 `count`는 그냥 끝에서 멈춥니다. | **고려할 점** - `start`는 0부터 세며, 1부터 세는 SQL의 `substring`과 다릅니다. 파서가 1을 대신 더해 주므로 뜻하는 위치를 그대로 쓰십시오. - [`left`](#string-left)나 [`right`](#string-right)와 달리 이 함수는 속성에 대해 모호하지 않으므로, 속성의 앞부분을 취하는 더 안전한 방법입니다. ```cypher RETURN substring('ABCDEFG', 2) AS from_two, substring('ABCDEFG', 2, 3) AS three_from_two, substring('ABCDEFG', 4, 10) AS past_end; ``` ``` from_two | three_from_two | past_end ----------+----------------+---------- "CDEFG" | "CDE" | "EFG" ``` {#string-tolower} ## toLower ``` toLower ( string jsonb ) -> jsonb ``` 문자열을 소문자로 반환합니다. **고려할 점** - `jsonb`를 받으므로 [`reverse`](#string-reverse)와 달리 속성에 형 변환 없이 동작합니다. - [`lower`](#string-lower)가 PostgreSQL 쪽 대응 함수이고 그것도 동작합니다. 둘은 받고 반환하는 타입만 다릅니다. ```cypher MATCH (m:movie {title:'The Fifth Element'}) RETURN toLower(m.title) AS lower, toUpper(m.title) AS upper; ``` ``` lower | upper ---------------------+--------------------- "the fifth element" | "THE FIFTH ELEMENT" ``` {#string-toupper} ## toUpper ``` toUpper ( string jsonb ) -> jsonb ``` 문자열을 대문자로 반환합니다. 실제 예제는 [`toLower`](#string-tolower)를 참고하십시오. {#string-trim} ## trim ``` trim ( string jsonb ) -> jsonb ``` 문자열 양쪽 끝의 공백을 제거합니다. **고려할 점** - `trim`은 함수 이름이면서 문법 형태이기도 하므로, 여기서는 인자를 정확히 하나 받습니다. SQL의 `trim(BOTH 'x' FROM str)` 표기는 Cypher에서 쓸 수 없습니다: ```cypher RETURN trim(BOTH 'x' FROM 'xxaxx'); ``` ``` ERROR: syntax error at or near "BOTH" LINE 1: RETURN trim(BOTH 'x' FROM 'xxaxx'); ^ ``` {#string-upper} ## upper ``` upper ( string text ) -> text ``` 문자열을 대문자로 반환합니다. PostgreSQL 자신의 함수입니다. [`lower`](#string-lower)를 참고하십시오. {#string-matching-without-a-function} ## 함수 없이 일치시키기 문자열 검사 네 개는 함수가 아니라 연산자이며, 각각 직접 입력하지 않는 이름으로 카탈로그에 항목이 있습니다: | 연산자 | 구현 함수 | 참이 되는 조건 | | --- | --- | --- | | `STARTS WITH` | `string_starts_with` | 왼쪽 문자열이 오른쪽 문자열로 시작할 때 | | `ENDS WITH` | `string_ends_with` | 왼쪽 문자열이 오른쪽 문자열로 끝날 때 | | `CONTAINS` | `string_contains` | 오른쪽 문자열이 왼쪽 문자열 어디에든 나타날 때 | | `=~` | `string_regex` | 왼쪽 문자열이 오른쪽을 정규 표현식으로 삼아 일치할 때 | ```cypher MATCH (m:movie) WHERE m.title STARTS WITH 'The Matrix' RETURN count(*) AS n; ``` ``` n --- 4 ``` 넷 중 어느 것도 속성 인덱스를 쓸 수 없습니다. 각각 속성과의 비교가 아니라 속성에 대한 함수 호출이므로, 그중 하나로 걸러 내는 쿼리는 그 레이블을 스캔합니다. {#string-compatibility} ## 호환성 {#string-opencypher} ### openCypher openCypher는 대소문자 함수를 `toLower`·`toUpper`로, 공백 제거 함수를 `lTrim`·`rTrim`·`trim`으로 표기하며, 다섯 개 모두 동작합니다. openCypher의 `substring`도 여기서와 마찬가지로 0부터 셉니다. `left`와 `right`는 openCypher도 정의하는 PostgreSQL 함수입니다. 속성에 정수 리터럴을 함께 줄 때의 모호함은 표준에서 벗어난 점이고, 이식 가능한 형태는 `substring`입니다. {#string-see-also} ## 관련 항목 - [모든 함수](all-functions.md) — 모든 함수를 한 표에 - [타입 변환 함수](type-conversion.md) — `toString`, `toStringList` - [리스트 함수](list.md) — `split`이 반환하는 것