타입 변환 함수#

값을 다른 타입으로 바꾸는 함수들입니다. 두 계열이 있습니다. 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는 반올림하고, 이 함수는 버립니다.

관련 항목#