UNWIND#

리스트를 행으로 바꿉니다. 요소 하나마다 작업 행 하나입니다.

개요#

UNWIND list_expression AS variable

굵게 키워드 · 기울임 직접 채우는 자리 · [ ] 생략 가능 · ... 반복 가능. 구문 표기 규약을 참고하십시오.

설명#

UNWIND는 리스트를 파이프라인으로 펼칩니다. 요소마다 행 하나를 내놓고 variable을 그 요소에 바인딩하며, 이미 유효 범위에 있던 나머지는 그대로 함께 이어집니다. collect()의 역이고, 리스트를 담은 한 행에서 그 조각들을 담은 여러 행으로 가는 방법입니다.

  • AS variable은 필수입니다. 이름 없는 형태는 없습니다.

  • 리스트는 리터럴, 리스트 값을 가진 속성, collect()가 만든 변수, 또는 jsonb 배열이나 PostgreSQL 배열을 내놓는 표현식이면 됩니다. 스칼라는 거부됩니다.

  • 빈 리스트는 행을 내놓지 않으므로, 입력 행 전체가 사라집니다.

  • 리스트 안의 null도 다른 요소와 같은 요소이고 행을 만듭니다.

  • UNWIND는 들어오는 행마다 한 번 실행되고, 내놓는 행은 곱해집니다. 입력 행 셋에 요소 둘인 리스트면 여섯 행입니다.

  • UNWIND는 쿼리를 시작하거나 다른 절 뒤에 올 수 있습니다. 쿼리를 끝낼 수는 없습니다.

  • 리스트의 리스트를 펼치려면 UNWIND 절 두 개를 겹쳐 쓰십시오.

FOR가 GQL의 대응 절이고 같은 일을 하며, 순번을 선택적으로 함께 줍니다.

매개변수#

list_expression

jsonb 배열이나 PostgreSQL 배열을 내놓는 표현식입니다.

variable

각 요소에 바인딩되는 이름입니다. 이 절 뒤의 모든 절에서 보입니다.

예제#

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

리스트 리터럴 펼치기#

UNWIND [1, 91, 203, 1, 7, 91] AS n
RETURN n;
  n
-----
 1
 91
 203
 1
 7
 91
(6 rows)

리스트 순서대로 여섯 행이며, 중복도 포함됩니다.

리스트를 중복 제거하고 정렬하기#

리스트를 제자리에서 DISTINCT 처리하는 방법은 없습니다. 그것을 펼치고, 행의 중복을 없애고, 다시 모으십시오:

UNWIND [1, 91, 203, 1, 7, 91] AS n
WITH DISTINCT n
ORDER BY n
RETURN collect(n) AS uniq;
      uniq
-----------------
 [1, 7, 91, 203]
(1 row)

리스트로 MATCH를 돌리기#

요소마다 행 하나이고, 각각 차례로 일치됩니다:

UNWIND ['The Matrix', 'Inception'] AS t
MATCH (m:movie {title: t})
RETURN m.title AS film, m.year AS year;
     film     | year
--------------+------
 "The Matrix" | 1999
 "Inception"  | 2010
(2 rows)

클라이언트가 준 키 목록에 대해 쿼리를 실행하는 흔한 방법이 이것이며, 그 목록은 매개변수 하나로 넘깁니다.

리스트 값을 가진 속성 펼치기#

속성이 리스트를 담을 수 있고, UNWIND가 그것을 엽니다:

MATCH (m:movie {title: 'The Matrix'})
UNWIND m.embedding AS component
RETURN component;
  component
-------------
 -0.07594558
 0.04081754
 0.29592122
 -0.11921061
(4 rows)

collect 되돌리기#

collect()는 행을 리스트로 접고, UNWIND는 그것을 다시 펼칩니다. 집계한 다음 행으로 돌아가는 방법이 이 짝입니다:

MATCH (p:person)-[:acted_in]->(m:movie)
WITH collect(DISTINCT m.genre) AS genres
UNWIND genres AS genre
RETURN genre
ORDER BY genre;
    genre
-------------
 "Action"
 "Adventure"
 "Sci-Fi"
(3 rows)

리스트의 리스트 펼치기#

UNWIND 절 두 개이고, 두 번째는 첫 번째가 바인딩한 변수를 대상으로 합니다:

UNWIND [[1, 2], [3]] AS pair
UNWIND pair AS x
RETURN pair, x;
  pair  | x
--------+---
 [1, 2] | 1
 [1, 2] | 2
 [3]    | 3
(3 rows)

빈 리스트 펼치기#

행이 하나도 나오지 않고, 입력 행도 함께 사라집니다:

UNWIND [] AS x RETURN x;
 x
---
(0 rows)

빈 리스트에서도 행이 살아남아야 한다면 OPTIONAL MATCH나 CASE 보호 장치를 쓰십시오.

null을 남기기#

null인 요소도 요소입니다:

UNWIND [1, NULL, 3] AS x RETURN x;
  x
------
 1
 null
 3
(3 rows)

값이 null로 출력되는 것은 출력 컬럼이 jsonb이고, jsonb의 null은 없는 것이 아니라 하나의 값이기 때문입니다.

참고#

UNWIND에는 리스트가 필요합니다. 스칼라도, NULL만 쓴 것도 요소 하나짜리나 요소 없는 리스트로 취급되지 않습니다:

UNWIND 3 AS x RETURN x;
ERROR:  expression must be jsonb or array, but integer
LINE 1: UNWIND 3 AS x RETURN x;
               ^
UNWIND NULL AS x RETURN x;
ERROR:  expression must be jsonb or array, but unknown
LINE 1: UNWIND NULL AS x RETURN x;
               ^

속성이 반드시 있다고 보장되지 않는다면, UNWIND coalesce(m.tags, []) AS tag처럼 리스트가 아닐 수 있는 값을 감싸십시오.

호환성#

UNWIND는 GQL 절이 아니다#

ISO/IEC 39075에는 UNWIND가 없습니다. 리스트를 펼치는 표준의 문장은 <for statement>(§14.8)이고, AgensGraph는 그것도 FOR로 구현하고 있습니다. FOR에는 각 요소에 0부터 시작하는 위치를 주는 WITH OFFSET 절이 있는데, UNWIND는 그것을 할 수 없습니다.

관련 항목#

  • FOR GQL — 순번이 있는 표준 절

  • WITH — collect()가 놓이는 자리, 그리고 행의 중복을 없애는 방법

  • MATCH — 펼친 행으로 일치를 돌리기

  • 함수 — collect()와 그 밖의 리스트 함수들