문자열 함수#
텍스트에 대한 함수들입니다. 속성은 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
어떤 부분 문자열이 나타나는 모든 곳을 다른 문자열로 바꿉니다.
이름 |
타입 |
설명 |
|---|---|---|
|
|
검색할 문자열입니다. |
|
|
찾을 부분 문자열입니다. 첫 번째만이 아니라 나타나는 모든 곳이 바뀝니다. |
|
|
바꿔 넣을 문자열입니다. |
고려할 점
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글자만큼 이어집니다.
이름 |
타입 |
설명 |
|---|---|---|
|
|
자를 문자열입니다. |
|
|
첫 글자의 위치이며 0부터 셉니다. |
|
|
취할 글자 수입니다. 생략하면 문자열의 나머지 전부입니다. 끝을 넘어가는 |
고려할 점
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를 참고하십시오.
함수 없이 일치시키기#
문자열 검사 네 개는 함수가 아니라 연산자이며, 각각 직접 입력하지 않는 이름으로 카탈로그에 항목이 있습니다:
연산자 |
구현 함수 |
참이 되는 조건 |
|---|---|---|
|
|
왼쪽 문자열이 오른쪽 문자열로 시작할 때 |
|
|
왼쪽 문자열이 오른쪽 문자열로 끝날 때 |
|
|
오른쪽 문자열이 왼쪽 문자열 어디에든 나타날 때 |
|
|
왼쪽 문자열이 오른쪽을 정규 표현식으로 삼아 일치할 때 |
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입니다.