중첩 키 값을 기반으로 JSONB 열의 배열 요소를 삭제하는 방법은 무엇입니까?

마르코

객체 키 중 하나의 값을 기준으로 배열에서 객체를 제거하려면 어떻게해야합니까?

배열은 상위 개체 내에 중첩됩니다.

다음은 샘플 구조입니다.

{
  "foo1": [ { "bar1": 123, "bar2": 456 }, { "bar1": 789, "bar2": 42 } ],
  "foo2": [ "some other stuff" ]
}

의 값을 기반으로 배열 요소를 제거 할 수 있습니까 bar1?

나는이에 따라 조회 할 수 있습니다 bar1사용하여 값 : columnname @> '{ "foo1": [ { "bar1": 123 } ]}'하지만 제거하는 방법을 찾는 운이 했어 { "bar1": 123, "bar2": 456 }에서 foo1다른 그대로 모든 것을 유지하면서.

감사


PostgreSQL 9.6 실행

패트릭

특정 값의 내부 개체가있는 특정 개체를 검색하고이 특정 개체가 배열의 어느 위치 에나 나타날 수 있다고 가정하면 문서와 각 배열의 압축을 풀고 내부 하위 문서를 테스트해야합니다. 포함하고 적절하게 삭제 한 다음 배열과 JSON 문서를 다시 어셈블합니다 (테스트되지 않음).

SELECT id, jsonb_build_object(key, jarray)
FROM (
    SELECT foo.id, foo.key, jsonb_build_array(bar.value) AS jarray
    FROM (  SELECT id, key, value
            FROM my_table, jsonb_each(jdoc) ) foo,
        jsonb_array_elements(foo.value) AS bar (value)
    WHERE NOT bar.value @> '{"bar1": 123}'::jsonb
    GROUP BY 1, 2 ) x
GROUP BY 1;

이제 이것은 약간 조밀 해 보일 수 있으므로 분리하면 다음과 같은 결과를 얻을 수 있습니다.

SELECT id, key, value
FROM my_table, jsonb_each(jdoc)

이것은 테이블에서 측면 조인을 사용하여 JSON 문서를 가져와 배열 포함 된 jdoc행 집합으로 변환합니다 . 테이블의 기본 키입니다.foo(id, key, value)valueid

그런 다음 우리는 다음을 얻습니다.

SELECT foo.id, foo.key, jsonb_build_array(bar.value) AS jarray
FROM foo,  -- abbreviated from above
     jsonb_array_elements(foo.value) AS bar (value)
WHERE NOT bar.value @> '{"bar1": 123}'::jsonb
GROUP BY 1, 2

이것은 또 다른 측면 조인을 사용하여 배열을 bar(value)으로 압축 해제합니다 . 이제 포함 연산자를 사용하여 이러한 개체를 검색하여 결과 집합에서 개체를 제거 할 수 있습니다 WHERE NOT bar.value @> '{"bar1": 123}'::jsonb.. 선택 목록에서 배열은 재 조립에 의해입니다 idkey하지만 지금은 기분을 상하게 하위 문서없이.

마지막으로 기본 쿼리에서 JSON 문서가 재 조립됩니다.

SELECT id, jsonb_build_object(key, jarray)
FROM x  -- from above
GROUP BY 1;

이해해야 할 중요한 점은 PostgreSQL JSON 함수가 명시 적으로 표시 할 수있는 JSON 문서 수준에서만 작동한다는 것입니다. 문서의 특정 수준에 대한 명시 적 경로가없는 경우 일반적으로 문서의 최상위 수준입니다 {foo1, 0, bar1}. 해당 수준의 작업에서 개체 제거와 같은 처리를 수행하기 위해 압축을 풀 수 있습니다.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

배열에서 특정 요소를 가져오고 배열 키 값의 비교를 기반으로 새 배열을 만드는 방법은 무엇입니까?

분류에서Dev

중복 키를 기반으로 객체 배열을 병합 / 결합하는 방법은 무엇입니까?

분류에서Dev

객체의 PostgreSQL jsonb 배열을 반복하고 요소를 수정하는 방법은 무엇입니까?

분류에서Dev

한 배열의 요소를 키로 다른 배열에 매핑하고 결과 값을 배열로 반환하는 방법은 무엇입니까?

분류에서Dev

중첩 배열의 값을 기반으로 객체를 반환하는 방법은 무엇입니까? (자바 스크립트)

분류에서Dev

중첩 된 jsonb 배열 요소를 결합하는 방법은 무엇입니까?

분류에서Dev

두 열의 값을 기반으로 중복 행을 삭제하는 방법은 무엇입니까?

분류에서Dev

jsonb 배열의 중첩 키를 기반으로 행 찾기

분류에서Dev

깊은 중첩 해시 배열의 키 값을 기반으로 해시 배열을 병합하는 방법

분류에서Dev

키를 기반으로 배열 값을 합산하는 방법은 무엇입니까?

분류에서Dev

객체의 다른 배열을 가리키는 중첩 된 객체 배열을 반복적으로 반복하는 방법은 무엇입니까?

분류에서Dev

jsonb 열의 중첩 값에 조인하는 방법은 무엇입니까?

분류에서Dev

Python에서 사전의 키를 기반으로 pandas 열 값을 추가하는 방법은 무엇입니까?

분류에서Dev

배열이 크기와 중첩을 가질 수 있다면 PHP 배열의 특정 키에서 모든 데이터를 얻는 방법은 무엇입니까?

분류에서Dev

키워드를 기반으로 배열을 동적으로 분할하는 방법은 무엇입니까?

분류에서Dev

연속 요소의 배열 객체의 반복 키 값 수를 얻는 방법은 무엇입니까?

분류에서Dev

중첩 배열이있는 요소의 배열을 필터링하는 방법은 무엇입니까?

분류에서Dev

키를 기반으로 항목을 배열로 결합하는 방법은 무엇입니까?

분류에서Dev

중첩 된 배열 값을 기준으로 값을 필터링하는 방법은 무엇입니까?

분류에서Dev

키가 아닌 값을 기반으로 객체 배열을 반복하는 방법은 무엇입니까?

분류에서Dev

키가 아닌 값을 기반으로 객체 배열을 반복하는 방법은 무엇입니까?

분류에서Dev

PHP 5.3에서 다른 배열의 값을 기반으로 배열 요소의 배열을 정렬하는 방법은 무엇입니까?

분류에서Dev

Postgres : 배열의 각 요소에 대한 jsonb 값 유형을 변경하는 방법은 무엇입니까?

분류에서Dev

해시 배열에서 루비의 키에 대한 특정 값을 가진 요소를 삭제하는 방법은 무엇입니까?

분류에서Dev

사전 키를 기반으로 배열을 필터링하는 방법은 무엇입니까?

분류에서Dev

특정 키의 값이 동일한 경우 값을 중첩 된 객체 배열로 업데이트하는 방법은 무엇입니까?

분류에서Dev

중첩 배열의 배열 키없이 PHP cURL로 다차원 배열을 보내는 방법은 무엇입니까?

분류에서Dev

다른 열을 기준으로 중복 항목 중 하나를 삭제하는 방법은 무엇입니까?

분류에서Dev

json 배열의 중첩 값을 재귀 적으로 검색하는 방법은 무엇입니까?

Related 관련 기사

  1. 1

    배열에서 특정 요소를 가져오고 배열 키 값의 비교를 기반으로 새 배열을 만드는 방법은 무엇입니까?

  2. 2

    중복 키를 기반으로 객체 배열을 병합 / 결합하는 방법은 무엇입니까?

  3. 3

    객체의 PostgreSQL jsonb 배열을 반복하고 요소를 수정하는 방법은 무엇입니까?

  4. 4

    한 배열의 요소를 키로 다른 배열에 매핑하고 결과 값을 배열로 반환하는 방법은 무엇입니까?

  5. 5

    중첩 배열의 값을 기반으로 객체를 반환하는 방법은 무엇입니까? (자바 스크립트)

  6. 6

    중첩 된 jsonb 배열 요소를 결합하는 방법은 무엇입니까?

  7. 7

    두 열의 값을 기반으로 중복 행을 삭제하는 방법은 무엇입니까?

  8. 8

    jsonb 배열의 중첩 키를 기반으로 행 찾기

  9. 9

    깊은 중첩 해시 배열의 키 값을 기반으로 해시 배열을 병합하는 방법

  10. 10

    키를 기반으로 배열 값을 합산하는 방법은 무엇입니까?

  11. 11

    객체의 다른 배열을 가리키는 중첩 된 객체 배열을 반복적으로 반복하는 방법은 무엇입니까?

  12. 12

    jsonb 열의 중첩 값에 조인하는 방법은 무엇입니까?

  13. 13

    Python에서 사전의 키를 기반으로 pandas 열 값을 추가하는 방법은 무엇입니까?

  14. 14

    배열이 크기와 중첩을 가질 수 있다면 PHP 배열의 특정 키에서 모든 데이터를 얻는 방법은 무엇입니까?

  15. 15

    키워드를 기반으로 배열을 동적으로 분할하는 방법은 무엇입니까?

  16. 16

    연속 요소의 배열 객체의 반복 키 값 수를 얻는 방법은 무엇입니까?

  17. 17

    중첩 배열이있는 요소의 배열을 필터링하는 방법은 무엇입니까?

  18. 18

    키를 기반으로 항목을 배열로 결합하는 방법은 무엇입니까?

  19. 19

    중첩 된 배열 값을 기준으로 값을 필터링하는 방법은 무엇입니까?

  20. 20

    키가 아닌 값을 기반으로 객체 배열을 반복하는 방법은 무엇입니까?

  21. 21

    키가 아닌 값을 기반으로 객체 배열을 반복하는 방법은 무엇입니까?

  22. 22

    PHP 5.3에서 다른 배열의 값을 기반으로 배열 요소의 배열을 정렬하는 방법은 무엇입니까?

  23. 23

    Postgres : 배열의 각 요소에 대한 jsonb 값 유형을 변경하는 방법은 무엇입니까?

  24. 24

    해시 배열에서 루비의 키에 대한 특정 값을 가진 요소를 삭제하는 방법은 무엇입니까?

  25. 25

    사전 키를 기반으로 배열을 필터링하는 방법은 무엇입니까?

  26. 26

    특정 키의 값이 동일한 경우 값을 중첩 된 객체 배열로 업데이트하는 방법은 무엇입니까?

  27. 27

    중첩 배열의 배열 키없이 PHP cURL로 다차원 배열을 보내는 방법은 무엇입니까?

  28. 28

    다른 열을 기준으로 중복 항목 중 하나를 삭제하는 방법은 무엇입니까?

  29. 29

    json 배열의 중첩 값을 재귀 적으로 검색하는 방법은 무엇입니까?

뜨겁다태그

보관