문자열 함수#

텍스트에 대한 함수들입니다. 속성은 jsonb로 들어오고, 이 함수 중 몇 개는 text 오버로드와 jsonb 오버로드를 모두 갖고 있습니다. 파서가 어느 것을 고르는지는 무엇을 넘기는지에 달려 있으므로, 리터럴과 속성이 항상 같게 동작하지는 않습니다. 그것이 문제가 되는 항목마다 그 사실을 적어 두었습니다.

예제는 예제 데이터셋에서 실행됩니다.

left#

left ( string jsonb, n jsonb ) -> jsonb
left ( string text, n integer ) -> text

문자열의 앞 n글자를 반환합니다.

고려할 점

  • 속성에 정수 리터럴을 함께 주면 모호합니다. left(jsonb, jsonb)와 left(text, integer)가 똑같이 잘 맞기 때문입니다:

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을 쓰십시오.

  • n이 문자열보다 크면 문자열 전체를 반환합니다.

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"

lower#

lower ( string text ) -> text

문자열을 소문자로 반환합니다. PostgreSQL 자신의 함수이고, jsonb 문자열이 text로 변환되기 때문에 Cypher에서 닿을 수 있습니다. toLower가 Cypher 쪽 표기이고 jsonb를 곧바로 받습니다.

RETURN lower('AbCdeFG') AS lower, upper('AbCdeFG') AS upper;
   lower   |   upper
-----------+-----------
 "abcdefg" | "ABCDEFG"

lTrim#

lTrim ( string jsonb ) -> jsonb

문자열 앞쪽의 공백을 제거합니다.

고려할 점

  • 공백만 제거합니다. 제거할 문자 집합을 받는 형태는 없습니다. 그것이 필요하면 PostgreSQL의 ltrim(text, text)을 쓰십시오.

RETURN lTrim('    ABCD    ') AS l, rTrim('    ABCD    ') AS r, trim('    ABCD    ') AS both;
     l      |     r      |  both
------------+------------+--------
 "ABCD    " | "    ABCD" | "ABCD"

replace#

replace ( string jsonb, old jsonb, new jsonb ) -> jsonb

어떤 부분 문자열이 나타나는 모든 곳을 다른 문자열로 바꿉니다.

이름

타입

설명

string

jsonb

검색할 문자열입니다.

old

jsonb

찾을 부분 문자열입니다. 첫 번째만이 아니라 나타나는 모든 곳이 바뀝니다.

new

jsonb

바꿔 넣을 문자열입니다. old보다 길거나 짧아도 되고, 빈 문자열도 됩니다.

고려할 점

  • old와 new의 길이가 같아야 하는 것은 아닙니다.

  • 나타나지 않는 old를 주면 문자열이 그대로 반환됩니다.

MATCH (m:movie {title:'Terminator 2: Judgment Day'})
RETURN replace(m.title, 'Judgment', 'Judgement') AS british;
            british
-------------------------------
 "Terminator 2: Judgement Day"

reverse#

reverse ( string text ) -> text
reverse ( list jsonb ) -> jsonb
reverse ( list anyarray ) -> anyarray

문자열이나 리스트를 뒤집습니다.

고려할 점

  • 어느 오버로드를 받는지는 인자에 달려 있고, 그 둘은 문자열에 대해 서로 다르게 굽니다. 문자열 리터럴은 reverse(text)로 해석되어 뒤집힙니다. 문자열 속성은 이미 jsonb이므로 reverse(jsonb)로 해석되는데, 그것은 배열만 뒤집습니다:

RETURN reverse('Blade Runner 2049'::jsonb);
ERROR:  reverse(): list is expected but "Blade Runner 2049"

속성 참조는 이미 jsonb이므로 그 형 변환과 같게 동작합니다. 글자를 뒤집으려면 반대로 형 변환을 하십시오. reverse(m.title::text)입니다.

  • 리스트 속성에는 형 변환이 필요하지 않습니다. jsonb 오버로드가 리스트를 뒤집습니다.

RETURN reverse('ABCDEFG') AS text, reverse([1,2,3]) AS list;
   text    |   list
-----------+-----------
 "GFEDCBA" | [3, 2, 1]
MATCH (m:movie {title:'Blade Runner 2049'}) RETURN reverse(m.title::text) AS backwards;
      backwards
---------------------
 "9402 rennuR edalB"

right#

right ( string jsonb, n jsonb ) -> jsonb
right ( string text, n integer ) -> text

문자열의 뒤 n글자를 반환합니다. 속성에 정수 리터럴을 함께 줄 때의 모호함을 left와 공유하며, 그것을 푸는 두 방법도 같습니다.

rTrim#

rTrim ( string jsonb ) -> jsonb

문자열 뒤쪽의 공백을 제거합니다. 실제 예제는 lTrim을 참고하십시오.

split#

split ( string text, delimiter text ) -> anyarray

구분자가 나타나는 모든 곳에서 문자열을 잘라 리스트로 만듭니다.

고려할 점

  • 그 값은 문자열의 배열입니다. 카탈로그가 반환 타입을 anyarray로 선언하므로 SQL에서 pg_typeof가 anyarray로 보고합니다. Cypher의 RETURN은 그것을 jsonb 리스트로 감쌉니다.

  • 나타나지 않는 구분자를 주면 문자열 전체를 담은 요소 하나짜리 리스트가 반환됩니다.

  • 구분자는 패턴이 아니라 리터럴 문자열입니다. 정규 표현식이 필요하면 PostgreSQL의 regexp_split_to_array를 쓰십시오.

RETURN split('Action/Sci-Fi/Drama', '/') AS genres;
            genres
-------------------------------
 ["Action", "Sci-Fi", "Drama"]

str_size#

str_size ( string text ) -> integer

문자열의 글자 수를 integer로 반환합니다.

고려할 점

  • size와 length가 Cypher 쪽 표기이고 jsonb를 반환합니다. 이 함수는 네이티브 integer를 원하는 호출자가 그것을 벗겨 내지 않아도 되게 하려고 있습니다. 드라이버, 또는 Cypher 쿼리를 감싸는 SQL이 그런 호출자입니다.

RETURN str_size('hello') AS n;
 n
---
 5

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나 right와 달리 이 함수는 속성에 대해 모호하지 않으므로, 속성의 앞부분을 취하는 더 안전한 방법입니다.

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"

toLower#

toLower ( string jsonb ) -> jsonb

문자열을 소문자로 반환합니다.

고려할 점

  • jsonb를 받으므로 reverse와 달리 속성에 형 변환 없이 동작합니다.

  • lower가 PostgreSQL 쪽 대응 함수이고 그것도 동작합니다. 둘은 받고 반환하는 타입만 다릅니다.

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"

toUpper#

toUpper ( string jsonb ) -> jsonb

문자열을 대문자로 반환합니다. 실제 예제는 toLower를 참고하십시오.

trim#

trim ( string jsonb ) -> jsonb

문자열 양쪽 끝의 공백을 제거합니다.

고려할 점

  • trim은 함수 이름이면서 문법 형태이기도 하므로, 여기서는 인자를 정확히 하나 받습니다. SQL의 trim(BOTH 'x' FROM str) 표기는 Cypher에서 쓸 수 없습니다:

RETURN trim(BOTH 'x' FROM 'xxaxx');
ERROR:  syntax error at or near "BOTH"
LINE 1: RETURN trim(BOTH 'x' FROM 'xxaxx');
                    ^

upper#

upper ( string text ) -> text

문자열을 대문자로 반환합니다. PostgreSQL 자신의 함수입니다. lower를 참고하십시오.

함수 없이 일치시키기#

문자열 검사 네 개는 함수가 아니라 연산자이며, 각각 직접 입력하지 않는 이름으로 카탈로그에 항목이 있습니다:

연산자

구현 함수

참이 되는 조건

STARTS WITH

string_starts_with

왼쪽 문자열이 오른쪽 문자열로 시작할 때

ENDS WITH

string_ends_with

왼쪽 문자열이 오른쪽 문자열로 끝날 때

CONTAINS

string_contains

오른쪽 문자열이 왼쪽 문자열 어디에든 나타날 때

=~

string_regex

왼쪽 문자열이 오른쪽을 정규 표현식으로 삼아 일치할 때

MATCH (m:movie) WHERE m.title STARTS WITH 'The Matrix' RETURN count(*) AS n;
 n
---
 4

넷 중 어느 것도 속성 인덱스를 쓸 수 없습니다. 각각 속성과의 비교가 아니라 속성에 대한 함수 호출이므로, 그중 하나로 걸러 내는 쿼리는 그 레이블을 스캔합니다.

호환성#

openCypher#

openCypher는 대소문자 함수를 toLower·toUpper로, 공백 제거 함수를 lTrim·rTrim·trim으로 표기하며, 다섯 개 모두 동작합니다. openCypher의 substring도 여기서와 마찬가지로 0부터 셉니다. left와 right는 openCypher도 정의하는 PostgreSQL 함수입니다. 속성에 정수 리터럴을 함께 줄 때의 모호함은 표준에서 벗어난 점이고, 이식 가능한 형태는 substring입니다.

관련 항목#