타입 변환 함수#
값을 다른 타입으로 바꾸는 함수들입니다. 두 계열이 있습니다. to… 함수는 값을 읽고 그것이 해당
타입의 값을 나타내지 않으면 null을 반환합니다. to…OrNull 변형은 같은 일을 하되 결코 오류를 내지
않습니다.
형 변환이 또 다른 변환 방법이고, Cypher는 대부분의 타입 이름에 대해 ::를 받습니다:
RETURN '42'::int AS i, 42::numeric AS n, 'true'::boolean AS b, '2020-01-01'::date AS d;
i | n | b | d
----+----+---+--------------
42 | 42 | t | "2020-01-01"
::timestamp와 ::time이 예외입니다:
RETURN pg_typeof('2020-01-01 10:00'::timestamp);
ERROR: syntax error at or near "timestamp"
LINE 1: RETURN pg_typeof('2020-01-01 10:00'::timestamp);
^
Cypher의 형 변환은 평범한 타입 이름을 받고, 수치·문자·비트·json·interval 표기에 대해서는 자기
규칙을 갖고 있습니다. 날짜와 시각 표기에 대한 규칙은 없습니다. TIMESTAMP와 TIME은 키워드이므로
그 둘로의 형 변환에는 그런 규칙이 필요한데 그것이 없습니다. date, timestamptz, timetz는
키워드가 아니어서 평범한 타입 이름으로 들어와 동작합니다. 흔한 우회 방법은 ::timestamptz이고,
다른 하나는 그 Cypher를 SQL로 감싸는 것입니다.
예제는 예제 데이터셋에서 실행됩니다.
toBoolean#
toBoolean ( value text ) -> boolean
toBoolean ( value "any" ) -> boolean
값이 나타내는 불리언을 반환하고, 아무것도 나타내지 않으면 null을 반환합니다.
고려할 점
대소문자와 무관하게
true,false,t,f,on,off,1,0을 받습니다. 그 밖의 것은 오류를 내지 않고 null을 반환합니다.형 변환보다 엄격합니다.
toBoolean('yes')는 null이지만'yes'::boolean은 참입니다.RETURN은 불리언을 감싸지 않고 두므로t나f로 출력되고, null은 빈 칸으로 출력됩니다.
RETURN toBoolean('TRUE') AS t, toBoolean('false') AS f, toBoolean(true) AS already;
t | f | already
---+---+---------
t | f | t
toBooleanOrNull#
toBooleanOrNull ( value text ) -> boolean
toBooleanOrNull ( value "any" ) -> boolean
값이 나타내는 불리언을 반환하거나 null을 반환합니다. toBoolean이 아예
읽을 수 없는 타입에서 오류를 낼 수 있는 자리에서, 이 함수는 null을 반환합니다.
RETURN toBooleanOrNull('yes') AS unrecognised, toBooleanOrNull('true') AS recognised;
unrecognised | recognised
--------------+------------
| t
toFloat#
2.18에 추가
toFloat ( value "any" ) -> double precision
값이 나타내는 부동소수점 수를 반환하거나 null을 반환합니다.
고려할 점
"any"를 받는 오버로드 하나이므로, 문자열·정수·jsonb속성을 형 변환 없이 받습니다.숫자가 아닌 값은 오류를 내지 않고 null을 반환합니다.
결과는
double precision입니다. Cypher의RETURN은 그것을jsonb숫자로 감쌉니다.
RETURN toFloat('3.5') AS from_string, toFloat(7) AS from_integer, toFloat('abc') AS unreadable;
from_string | from_integer | unreadable
-------------+--------------+------------
3.5 | 7 |
toFloatList#
toFloatList ( list jsonb ) -> jsonb
toFloatList ( list anyarray ) -> double precision[]
리스트의 모든 요소를 부동소수점 수로 변환합니다.
고려할 점
어느 오버로드를 받는지가 반환 타입을 결정합니다. Cypher의 리스트는
jsonb이므로toFloatList([...])는jsonb를 반환합니다.double precision[]을 주는 것은 PostgreSQL 배열 인자뿐이고, 그 형태는 SQL에서 닿을 수 있습니다.숫자가 아닌 요소는 null이 됩니다. 리스트의 길이는 유지됩니다.
RETURN toFloatList(['1.4','2.5','true']) AS floats, pg_typeof(toFloatList(['1.4'])) AS type;
floats | type
------------------+---------
[1.4, 2.5, null] | "jsonb"
SELECT toFloatList(ARRAY['1.5','2']) AS floats, pg_typeof(toFloatList(ARRAY['1.5','2'])) AS type;
floats | type
---------+--------------------
{1.5,2} | double precision[]
toInteger#
2.18에 추가
toInteger ( value "any" ) -> bigint
값이 나타내는 정수를 반환하거나 null을 반환합니다.
고려할 점
반올림하지 않고 0쪽으로 버립니다.
toInteger(3.7)은 3입니다.불리언도 변환되며, 참은 1이 됩니다.
숫자가 아닌 값은 오류를 내지 않고 null을 반환합니다.
결과는
bigint입니다.
RETURN toInteger('42') AS from_string, toInteger(3.7) AS truncated,
toInteger('abc') AS unreadable, toInteger(true) AS from_boolean;
from_string | truncated | unreadable | from_boolean
-------------+-----------+------------+--------------
42 | 3 | | 1
toIntegerList#
toIntegerList ( list jsonb ) -> jsonb
toIntegerList ( list anyarray ) -> bigint[]
리스트의 모든 요소를 정수로 변환합니다. 어느 오버로드가 적용되는지가 반환 타입을 결정하며,
toFloatList와 정확히 같습니다. Cypher 리스트는 jsonb를,
PostgreSQL 배열은 bigint[]를 줍니다.
RETURN toIntegerList(['1','2','x']) AS integers;
integers
--------------
[1, 2, null]
toString#
toString ( value jsonb ) -> jsonb
값의 문자열 형태를 반환합니다.
고려할 점
이미 문자열인 값은 그대로 돌아옵니다.
숫자·불리언·리스트·맵 모두 변환됩니다. 결과는
jsonb문자열이므로RETURN은 그것을 따옴표와 함께 출력합니다.
RETURN toString(11.5) AS number, toString('already a string') AS string, toString(true) AS boolean;
number | string | boolean
--------+--------------------+---------
"11.5" | "already a string" | "true"
toStringList#
toStringList ( list jsonb ) -> jsonb
toStringList ( list anyarray ) -> text[]
리스트의 모든 요소를 문자열로 변환합니다. 어느 오버로드가 적용되는지가 반환 타입을 결정하며,
toFloatList와 같습니다. Cypher 리스트는 jsonb를, PostgreSQL
배열은 text[]를 줍니다.
RETURN toStringList([1, 2.5, true]) AS strings;
strings
----------------------
["1", "2.5", "true"]
toStringOrNull#
toStringOrNull ( value "any" ) -> text
값의 문자열 형태를 반환하고, 그 값에 문자열 형태가 없으면 null을 반환합니다.
고려할 점
toString과 달리jsonb가 아니라text를 반환합니다. Cypher의RETURN이 그것을 다시jsonb문자열로 감싸므로 지면에서는 둘이 같아 보이지만, SQL에서는 그렇지 않습니다.리스트는 null을 반환합니다. 리스트에는 하나의 문자열 형태가 없습니다.
RETURN toStringOrNull(11.5) AS number, toStringOrNull([1,2]) AS list,
pg_typeof(toStringOrNull(1)) AS type;
number | list | type
--------+------+--------
"11.5" | | "text"
변환되지 않는 것#
위에서 본 것처럼 ::timestamp와 ::time은 Cypher에 쓸 수 없습니다. 그리고 toMap도, toList도,
toDate도 없습니다. 맵은 {...}로, 리스트는 [...]로 만들고, 날짜는 ::date로 읽으십시오.
그래프 요소는 자기 properties로만 변환되고 그 밖으로는 변환되지 않습니다. v::jsonb가 그 맵을
주며, properties(v)와 같은 값입니다. 맵에서 정점으로 되돌리는 변환은
없습니다.
호환성#
openCypher#
toInteger, toFloat, toString, toBoolean은 openCypher의 이름이고 openCypher가 설명하는 대로
동작합니다. 예외 하나는, 읽을 수 없는 값에 대해 오류를 내지 않고 null을 반환한다는 점입니다.
…OrNull 변형과 리스트 변환 세 개는 확장입니다.
openCypher의 toInteger는 반올림하고, 이 함수는 버립니다.
관련 항목#
모든 함수 — 모든 함수를 한 표에
문자열 함수 —
split,toLower,toUpper리스트 함수 — 이 변환들이 내놓는 리스트
jsonb 연산자와 함수 —
to_jsonb와#>> '{}'관용구