이 문서는 지원되지 않는 버전의 PostgreSQL 용입니다.
당신은에 대해 같은 페이지를 보려고 할 수 있습니다PostgreSQL : 문서 : 17 : 8.14. 토토 사이트 순위 유형버전 또는 위에 나열된 다른 지원 버전 중 하나입니다.

8.14. 젠 토토type#

젠 토토 데이터 유형은 젠 토토 (javaScript 객체 표기법) 데이터를 저장하는 것입니다.RFC 7159. 이러한 데이터는로 저장 될 수 있습니다.텍스트, 그러나 젠 토토 데이터 유형은 젠 토토 규칙에 따라 각 저장된 값이 유효하다는 것을 시행 할 수 있습니다. 또한 이러한 데이터 유형에 저장된 데이터에 사용할 수있는 다양한 젠 토토- 특이 적 기능 및 연산자가 있습니다. 보다섹션 9.16.

PostgreSQLoffers two types for storing 젠 토토 data:젠 토토and젠 토토B. 이러한 데이터 유형에 대한 효율적인 쿼리 메커니즘을 구현하려면PostgreSQL또한 제공젠 토토PATH설명 된 데이터 유형섹션 8.14.7.

the젠 토토and젠 토토B데이터 유형 수락거의입력과 동일한 값 세트. 실질적인 차이점은 효율성 중 하나입니다. 그만큼젠 토토데이터 유형은 입력 텍스트의 정확한 사본을 저장하며, 이는 각 실행에 따라 처리 기능이 재발해야합니다. 하는 동안젠 토토B데이터는 분해 된 이진 형식으로 저장되어 전환 오버 헤드가 추가되어 입력이 약간 느리게 만들어 지지만 재배치가 필요하지 않기 때문에 처리가 훨씬 빠릅니다.젠 토토B또한 인덱싱을 지원합니다. 이는 상당한 이점이 될 수 있습니다.

왜냐하면젠 토토타입 입력은 입력 텍스트의 정확한 사본을 저장하면 토큰 사이의 의미 적으로 유의미한 공백과 젠 토토 객체 내의 키 순서를 보존합니다. 또한 값의 젠 토토 객체에 동일한 키가 두 번 이상 포함되면 모든 키/값 쌍이 유지됩니다. (처리 함수는 마지막 값을 조작 값으로 간주합니다.) 대조적으로젠 토토B공백을 보존하지 않고 객체 키의 순서를 보존하지 않으며 중복 객체 키를 유지하지 않습니다. 중복 키가 입력에 지정되면 마지막 값 만 유지됩니다.

일반적으로 대부분의 응용 프로그램은 젠 토토 데이터를로 저장하는 것을 선호해야합니다.젠 토토B, 객체 키 순서에 대한 레거시 가정과 같은 매우 전문화 된 요구가 없다면.

RFC7159 젠 토토 스트링은 UTF8에서 인코딩되어야한다고 지정합니다. 따라서 데이터베이스 인코딩이 UTF8이 아닌 한 젠 토토 유형은 젠 토토 사양에 엄격하게 준수 할 수 없습니다. 데이터베이스 인코딩에 표시 할 수없는 문자를 직접 포함시키려는 시도는 실패합니다. 반대로, 데이터베이스 인코딩에서 표현할 수 있지만 UTF8에서는 그렇지 않은 문자가 허용됩니다.

RFC7159 젠 토토 문자열은 유니 코드 이스케이프 시퀀스를 포함하도록 허용\ uxxxx. 의 입력 함수에서젠 토토유형, 유니 코드 탈출은 데이터베이스 인코딩에 관계없이 허용되며 구문 적 정확성에 대해서만 확인됩니다 (즉, 4 개의 16 진수 숫자가 따릅니다\ u). 그러나에 대한 입력 함수젠 토토B더 엄격합니다 : 데이터베이스 인코딩에서 표현할 수없는 문자에 대한 유니 코드 탈출을 비활성화합니다. 그만큼젠 토토B유형도 거부\ u0000PostgreSQL's텍스트type), 유니 코드 기본 다국어 평면 외부의 문자를 지정하기 위해 유니 코드 대리 쌍을 사용하는 것이 정확하다고 주장합니다. 유효한 유니 코드 이스케이프는 스토리지와 동등한 단일 문자로 변환됩니다. 여기에는 단일 문자로 대리 쌍을 접는 것이 포함됩니다.

Note

많은 젠 토토 처리 기능에 설명 된섹션 9.16유니 코드 에스케이프를 일반 문자로 변환하므로 입력이 유형이더라도 설명에도 설명 된 동일한 유형의 오류를 방금 던집니다.젠 토토not젠 토토B. 사실젠 토토입력 함수는 대표 된 문자를 지원하지 않는 데이터베이스 인코딩에서 젠 토토 유니 코드 탈출의 간단한 스토리지 (처리없이)를 허용하지만, 이러한 검사는 역사적 아티팩트로 간주 될 수 있습니다..

텍스트 젠 토토을 변환 할 때젠 토토BRFC7159는 효과적으로 네이티브에 매핑됩니다PostgreSQL유형, 참조표 8.23. 따라서 유효한 구성 요소에 대한 약간의 추가 제약이 있습니다젠 토토B15503_15536젠 토토기본 데이터 유형으로 표현할 수있는 내용에 대한 제한에 해당하는 초록의 유형 또는 젠 토토에. 특히,젠 토토B|PostgreSQL 숫자데이터 유형, while젠 토토그렇지 않습니다. 이러한 구현 정의 제한은에 의해 허용됩니다.RFC7159. 그러나 실제로 이러한 문제는 젠 토토을 대표하는 것이 일반적이므로 다른 구현에서 발생할 가능성이 훨씬 높습니다.번호IEEE 754 이중 정밀 부유 포인트로의 원시 유형 (whoRFC7159 명시 적으로 기대하고 허용). 젠 토토을 이러한 시스템과의 교환 형식으로 사용하는 경우 원래 저장된 데이터에 비해 숫자 정밀도를 잃을 위험이PostgreSQL고려해야합니다.

반대로, 테이블에 언급 된 바와 같이, 해당 젠 토토 원시 유형의 입력 형식에 약간의 제한이 있습니다PostgreSQL타입.

표 8.23. 젠 토토 원시 유형 및 해당PostgreSQL타입

젠 토토 원시 유형 PostgreSQL타입 노트
String 텍스트 \ u0000데이터베이스 인코딩에서 사용할 수없는 문자를 나타내는 유니 코드 탈출과 마찬가지로 허용되지 않습니다
번호 숫자 NANandInfinity값은 허용되지 않습니다
부울 부울 소문자 만trueandfalse철자가 허용됩니다
null (없음) SQLNULL다른 개념입니다

8.14.1. 젠 토토 입력 및 출력 구문#

젠 토토 데이터 유형의 입력/출력 구문은RFC 7159.

다음은 모두 유효합니다젠 토토(또는젠 토토B) 표현 :

- 간단한 스칼라/원시 값
- 원시 값은 숫자, 인용 문자열, 참, 거짓 또는 null 일 수 있습니다.
선택 '5':: 젠 토토;

- 0 이상의 요소 배열 (요소가 같은 유형 일 필요는 없음)
'[1, 2, "foo", null] :: json을 선택하십시오.

- 키와 값 쌍을 포함하는 객체
- 객체 키는 항상 문자열이어야합니다.
선택 ' "bar": "baz", "balance": 7.77, "active": false':: json;

- 배열 및 객체는 임의로 중첩 될 수 있습니다
' "foo": [true, "bar"], "tags":  "a": 1, "b": null':: json;를 선택하십시오.

앞에서 언급했듯이 젠 토토 값이 입력 된 다음 추가 처리없이 인쇄 할 때젠 토토입력 한 것과 동일한 텍스트를 출력하는 동안젠 토토Bwhitespace와 같은 의미 적으로 유의 한 세부 사항을 보존하지 않습니다. 예를 들어, 차이점에 주목하십시오.

선택 ' "bar": "baz", "balance": 7.77, "active": false':: json;
                      젠 토토
-------------------------------------------------------------
  "bar": "baz", "balance": 7.77, "active": false

주목할만한 의미있는 세부 사항 중 하나는입니다.젠 토토B, 숫자는 기본의 행동에 따라 인쇄됩니다숫자타입. 실제로 이것은 숫자로 입력 된 숫자를 의미합니다.e표기법은 예를들없이 인쇄됩니다.

선택 ' "읽기": 1.230e-5':: json, ' "reading": 1.230e-5':: 젠 토토B;
         젠 토토 |          젠 토토B
-----------------------------------------------------------
  "읽기": 1.230e-5 |  "읽기": 0.00001230

그러나젠 토토B이 예에서 볼 수 있듯이, 평등 점검과 같은 목적으로 의미 적으로 미미한 경우 에도이 예에서 볼 수 있듯이 후행 분수 제로를 보존합니다.

젠 토토 값을 구성하고 처리 할 수있는 내장 기능 및 운영자 목록의 경우 참조섹션 9.16.

8.14.2. 젠 토토 문서 디자인#

데이터를 젠 토토으로 표현하는 것은 요구 사항이 유동적 인 환경에서 강력한 기존 관계 데이터 모델보다 상당히 유연 할 수 있습니다. 동일한 응용 프로그램 내에서 두 가지 접근 방식이 공존하고 서로를 보완 할 수 있습니다. 그러나 최대 유연성이 필요한 애플리케이션의 경우에도 젠 토토 문서는 다소 고정 된 구조를 갖는 것이 좋습니다. 구조는 일반적으로 강화되지 않지만 (일부 비즈니스 규칙을 선언 적으로 시행 할 수 있지만) 예측 가능한 구조를 사용하면 세트를 유용하게 요약하는 쿼리를 쉽게 작성하는 것이 더 쉽습니다.문서(Datums) 테이블

젠 토토 데이터는 테이블에 저장 될 때 다른 데이터 유형과 동일한 동시성 제어 고려 사항이 적용됩니다. 큰 문서를 저장하는 것이 실제로 가능하지만, 모든 업데이트는 전체 행에서로드 레벨 잠금을 취득합니다. 업데이트 거래 간의 잠금 경합을 줄이기 위해 젠 토토 문서를 관리 가능한 크기로 제한하는 것을 고려하십시오. 이상적으로, 젠 토토 문서는 각각 비즈니스 규칙이 독립적으로 수정 될 수있는 더 작은 데이텀으로 합리적으로 세분화 될 수없는 원자 기준을 나타내야합니다.

8.14.3. 젠 토토B격리 및 존재#

테스트격리의 중요한 기능입니다.젠 토토B. 에 대한 평행 시설 세트가 없습니다.젠 토토타입. 격리는 하나 의지 테스트합니다젠 토토B문서는 다른 내부에 포함되어 있습니다. 이 예제는 언급 된대로 다음을 제외하고 참으로 반환됩니다.

- 간단한 스칼라/원시 값은 동일한 값 만 포함합니다.
' "foo"':: jsonb @ ' "foo"':: jsonb를 선택하십시오.

- 오른쪽의 배열은 왼쪽의 배열 내에 포함되어 있습니다.
'[1, 2, 3]':: jsonb @ '[1, 3]':: jsonb를 선택하십시오.

- 배열 요소의 순서는 중요하지 않으므로 이것은 사실입니다.
'[1, 2, 3]':: 젠 토토B @ '[3, 1]':: 젠 토토B;

- 중복 배열 요소도 중요하지 않습니다.
'[1, 2, 3]':: 젠 토토B @ '[1, 2, 2] :: 젠 토토B를 선택하십시오.

- 오른쪽에 단일 쌍이있는 객체가 포함되어 있습니다.
- 왼쪽의 물체 내에서 :
' "product": "postgresql", "버전": 9.4, "jsonb": true':: jsonb @ ' "버전": 9.4':: jsonb;

- 오른쪽의 배열은입니다.not- 비슷한 배열이 그 안에 중첩되어 있어도 왼쪽의 배열 :
'[1, 2, [1, 3]]':: jsonb @ '[1, 3] :: jsonb;  - 거짓을 생성합니다

- 그러나 둥지 층이 있으면 포함됩니다.
'[1, 2, [1, 3]]':: 젠 토토B @ '[[1, 3]]':: 젠 토토B;

- 마찬가지로, 격리는 여기에보고되지 않습니다.
' "foo":  "bar": "baz"':: jsonb @ ' "baz": "baz"':: jsonb;  - 거짓을 생성합니다

-최상위 키와 빈 객체가 포함되어 있습니다.
' "foo":  "bar": "baz"':: jsonb @ ' "foo": ':: jsonb;를 선택하십시오.

일반적인 원칙은 포함 된 객체가 포함되지 않은 배열 요소 또는 포함 객체에서 객체 키/값 쌍을 버린 후 포함 된 객체와 구조 및 데이터 내용과 일치해야한다는 것입니다. 그러나 배열 요소의 순서는 격리 일치를 할 때 중요하지 않으며 중복 배열 요소는 한 번만 효과적으로 고려됩니다.

구조가 일치해야한다는 일반 원칙에 대한 특별한 예외로서 배열에는 원시적 값이 포함될 수 있습니다.

-이 배열은 원시 문자열 값을 포함합니다.
'[ "foo", "bar"]':: jsonb @ ' "bar"':: jsonb를 선택하십시오.

-이 예외는 상호 적이 아닙니다.-비 함유는 다음과 같습니다.
' "bar"':: jsonb @ '[ "bar"]':: jsonb를 선택하십시오.  - 거짓

젠 토토B또한존재운영자, 이는 격리 주제의 변형 : 문자열이 (a로 주어진지 테스트합니다.텍스트value)의 상단 레벨에서 객체 키 또는 배열 요소로 나타납니다.젠 토토B값. 이 예제는 언급 된대로 다음을 제외하고 참으로 반환됩니다.

- 문자열은 배열 요소로 존재합니다.
'[ "foo", "bar", "baz"]':: jsonb를 선택하십시오. '술집';

- 문자열은 객체 키로 존재합니다.
' "foo": "bar"':: 젠 토토B를 선택하십시오. 'foo';

- 객체 값은 고려되지 않습니다.
' "foo": "bar"':: 젠 토토B를 선택하십시오. '술집';  - 거짓을 생성합니다

- 격리와 마찬가지로 존재는 최상위 수준에서 일치해야합니다.
' "foo":  "bar": "baz"':: 젠 토토B를 선택하십시오. '술집'; - 거짓을 생성합니다

- 프리미티브 젠 토토 문자열과 일치하는 경우 문자열이 존재하는 것으로 간주됩니다.
' "foo"':: 젠 토토B를 선택하십시오. 'foo';

젠 토토 객체는 많은 키나 요소가있을 때 격리 또는 존재를 테스트하기 위해 배열보다 더 적합합니다. 배열과 달리 검색을 위해 내부적으로 최적화되어 있고 선형으로 검색 할 필요가 없기 때문입니다..

젠 토토 격리가 중첩되어 있으므로 적절한 쿼리는 명시 적 하위 관류 선택을 건너 뛸 수 있습니다. 예를 들어, 우리에게가 있다고 가정합니다.doc최상위에 객체를 포함하는 열 대부분의 객체가 포함되어 있습니다태그하위 객체 배열이 포함 된 필드. 이 쿼리는 서브 객체가 두 가지를 포함하는 항목을 찾습니다."용어": "파리"and"용어": "Food"나타나면서 외부에서 그러한 키를 무시하면서태그배열 :

웹 사이트에서 doc- 'site_name'을 선택하십시오
  여기서 doc @ ' "tags": [ "term": "paris",  "term": "food"]';

하나는 같은 것을 성취 할 수 있습니다.

웹 사이트에서 doc- 'site_name'을 선택하십시오
  여기서 doc- 'tag' @ '[ "term": "Paris",  "term": "food"]';

그러나 그 접근법은 덜 유연하고 종종 덜 효율적입니다.

반면에 젠 토토 존재 연산자는 중첩되지 않았습니다. 젠 토토 값의 최상위 레벨에서 지정된 키 또는 배열 요소 만 찾습니다.

다른 모든 젠 토토 연산자 및 기능과 함께 다양한 격리 및 존재 연산자가 문서화되어 있습니다.섹션 9.16.

8.14.4. 젠 토토B인덱싱#

진 인덱스는 많은 수의 내에서 발생하는 키 또는 키/값 쌍을 효율적으로 검색하는 데 사용될 수 있습니다.젠 토토B문서 (Datums). 두 진운영자 클래스다른 성능과 유연성 트레이드 오프를 제공합니다.

기본 진 연산자 클래스젠 토토BKey-Exists 연산자와의 쿼리 지원?, ? |and? &, 격리 연산자@젠 토토PATH일치 연산자@?and@@. (이 운영자가 구현 한 의미론에 대한 자세한 내용은 참조표 9.48.)이 연산자 클래스와 인덱스를 생성하는 예는 다음과 같습니다.

gin (jdoc)을 사용하여 API에서 색인 Idxgin 생성;

비 디폴트 진 운영자 클래스젠 토토B_PATH_OPSKey-Exists 연산자를 지원하지 않지만 지원합니다@, @?@@. 이 연산자 클래스로 인덱스를 만드는 예는 다음과 같습니다.

gin (jdoc jsonb_path_ops)을 사용하여 API에서 index idxginp 만들기;

문서화 된 스키마 정의와 함께 타사 웹 서비스에서 검색된 젠 토토 문서를 저장하는 테이블의 예를 고려하십시오. 일반적인 문서는 다음과 같습니다.

"GUID": "9C36ADC1-7FB5-4D5B-83B4-90356A46061A",
    "이름": "Angela Barton",
    "is_active": 사실,
    "회사": "magnafone",
    "주소": "178 Howard Place, Gulf, Washington, 702",
    "등록": "2009-11-07T08 : 53 : 22 +08 : 00",
    "위도": 19.793713,
    "경도": 86.513373,
    "태그": [
        "enim",
        "aliquip",
        "Qui"
    ]]

우리는이 문서들을 명명 된 표에 저장합니다API, at젠 토토B열이라는 열jdoc. 이 열에서 진 인덱스가 생성되면 다음과 같은 쿼리는 색인을 사용할 수 있습니다.

- "회사"키가 "Magnafone"을 가진 문서 찾기
JDOC- 'GUID', JDOC- 'Name'을 선택하여 API에서 jdoc @ ' "회사": "magnafone"';를 선택하십시오.

그러나 연산자이기 때문에 다음과 같은 쿼리에는 인덱스를 사용할 수 없습니다?색인이 가능하며 색인 된 열에 직접 적용되지 않습니다jdoc:

- 키 "태그"에 키 또는 배열 요소 "qui"가 포함 된 문서 찾기
JDOC- 'GUID', JDOC- '이름'을 선택하여 API에서 JDOC- 'TAGS'를 선택하십시오. 'qui';

여전히 표현식 인덱스를 적절하게 사용하면 위의 쿼리가 인덱스를 사용할 수 있습니다. 내 특정 항목에 대한 쿼리 인 경우"태그"키는 일반적입니다. 이와 같이 인덱스를 정의하는 것이 가치가있을 수 있습니다 :

gin을 사용하여 API에서 index idxgintags 생성 ((jdoc- 'tags');

지금,여기서jdoc- 'tags'? 'qui'인덱스 가능한 연산자의 응용 프로그램으로 인식됩니다?색인 표현식jdoc- 'tags'. (표현 인덱스에 대한 자세한 내용은 참조 할 수 있습니다.무지개 토토 : 문서 : 18 : 11.7. 표현에 대한 색인.)

쿼리에 대한 또 다른 접근 방식은 격리를 악용하는 것입니다.

- 키 "태그"가 배열 요소 "qui"를 포함하는 문서 찾기
jdoc- 'guid', jdoc- 'name'을 선택하여 api @ ' "tags": [ "qui"]';

jdoc열 에서이 쿼리를 지원할 수 있습니다. 그러나 그러한 색인은 모든 키의 사본과에을 저장합니다.JDOC열, 그러나 이전 예제의 표현식 인덱스는에서 발견 된 데이터 만 저장합니다.태그키. Simple-Index 접근 방식은 훨씬 유연하지만 (모든 키에 대한 쿼리를 지원하므로) 대상 표현식 인덱스는 단순한 인덱스보다 검색이 더 작고 빠를 수 있습니다..

진 인덱스도 지원합니다@?@@작동하는 연산자젠 토토PATH일치. 예는입니다.

jdoc- 'Guid', jdoc- 'name'을 선택하여 api where jdoc @? '$ .tags [*]? (@ == "qui") ';
JDOC- 'GUID', JDOC- '이름'을 선택하여 aPI에서 jdoc @@ '$ .tags [*] == "qu"';

이 연산자의 경우 진 지수는 양식의 조항을 추출합니다Accessors_chain==상수OUT젠 토토PATH패턴 및이 조항에 언급 된 키와 값을 기반으로 인덱스 검색을 수행합니다. 액세서 체인에는., [*][색인]액세서. 그만큼젠 토토B_OPS운영자 클래스도 지원.*and.**액세서리이지만젠 토토B_PATH_OPS운영자 클래스는.

비록젠 토토B_PATH_OPS운영자 클래스는 쿼리 만 지원합니다.@, @?and@@운영자, 기본 연산자 클래스에 비해 주목할만한 성능 이점이 있습니다젠 토토B_OPS. 에이젠 토토B_PATH_OPS색인은 일반적으로 a보다 훨씬 작습니다.젠 토토B_OPS​​동일한 데이터를 통한 색인 및 특히 쿼리에 데이터에 자주 나타나는 키가 포함 된 경우 검색의 특이성이 더 좋습니다. 따라서 검색 작업은 일반적으로 기본 연산자 클래스보다 더 잘 수행됩니다.

a의 기술적 차이젠 토토B_OPS및 a젠 토토B_PATH_OPSGin Index는 전자가 각 키에 대한 독립적 인덱스 항목과 데이터의 값을 생성하는 반면, 후자는 데이터의 각 값에 대해 인덱스 항목 만 생성한다는 것입니다..[7]기본적으로 각젠 토토B_PATH_OPS색인 항목은 값의 해시이며이를 이끌어냅니다. 예를 들어 색인"foo": "bar": "baz"foo, barBAZ해시 값으로. 따라서이 구조를 찾는 격리 쿼리는 매우 구체적인 색인 검색을 초래할 것입니다. 그러나 전혀 알 수있는 방법이 없습니다foo열쇠로 나타납니다. 반면에, a젠 토토B_OPSindex는 3 개의 색인 항목을 대표합니다foo, barBAZ별도로; 그런 다음 격리 쿼리를 수행하려면 세 가지 항목 모두가 포함 된 행을 찾습니다. GIN 인덱스는 그러한 AN을 수행하고 검색을 상당히 효율적으로 수행 할 수 있지만, 여전히 그와 동등한 것보다 덜 구체적이고 느리게젠 토토B_PATH_OPS검색, 특히 세 가지 색인 항목 중 하나를 포함하는 매우 많은 행이있는 경우

의 단점젠 토토B_PATH_OPS접근 방식은 값과 같은 값을 포함하지 않는 젠 토토 구조에 대한 인덱스 항목을 생성하지 않는다는 것입니다."a":. 이러한 구조가 포함 된 문서를 검색하는 경우 전체 인덱스 스캔이 필요합니다. 이는 매우 느립니다.젠 토토B_PATH_OPS따라서 종종 그러한 검색을 수행하는 응용 프로그램에 적합하지 않습니다.

젠 토토B또한 지원btreeandHash인덱스. 이는 일반적으로 완전한 젠 토토 문서의 평등을 확인하는 것이 중요하다면 유용합니다. 그만큼btree주문젠 토토BDatums는 큰 관심의 거의 없지만 완전성은 다음과 같습니다.

개체  배열  부울  번호  String  NULL

n 쌍을 가진 객체  n -1 쌍이있는 물체

n 요소가있는 배열  n -1 요소가있는 배열

(역사적 이유로) 빈 최상층 배열이보다 작다는 제외NULL. 쌍의 수가 같은 객체는 순서대로 비교됩니다.

KEY-1, value-1, key-2 ...

객체 키는 스토리지 순서로 비교됩니다. 특히, 더 짧은 키가 더 긴 키 전에 저장되므로 :과 같은 직관적이지 않은 결과로 이어질 수 있습니다.

"aa": 1, "c": 1  "b": 1, "d": 1

마찬가지로, 요소의 수가 같은 배열은 순서대로 비교됩니다.

Element-1, Element-2 ...

원시 젠 토토 값은 기본과 동일한 비교 규칙을 사용하여 비교됩니다PostgreSQL데이터 유형. 문자열은 기본 데이터베이스 Collation을 사용하여 비교됩니다.

8.14.5. 젠 토토B구독#

the젠 토토B데이터 유형은 요소를 추출하고 수정하기 위해 배열 스타일의 구독 표현을 지원합니다. 중첩 값은 첨가 표현식을 체인하여 표시 할 수 있습니다.Path논쟁의젠 토토B_SET함수. a젠 토토B값은 배열이며, 숫자 첨자는 0에서 시작하며, 음수 정수는 배열의 마지막 요소에서 뒤로 계산됩니다. 슬라이스 표현식은 지원되지 않습니다. 첨자 표현식의 결과는 항상 젠 토토B 데이터 유형입니다.

업데이트명령문은을 사용할 수 있습니다.SET수정 조항젠 토토B값. 첨자 경로는 존재하는 한 영향을받는 모든 값에 대해 트래버블 가능해야합니다. 예를 들어, 경로val [ 'a'] [ 'b'] [ 'c']C모든 경우val, val [ 'a']val [ 'a'] [ 'b']는 객체입니다.val [ 'a']또는val [ 'a'] [ 'b']정의되지 않으면 빈 객체로 생성되어 필요에 따라 채워집니다. 그러나, 어떤 경우val그 자체 또는 중개 값 중 하나는 문자열, 번호 또는와 같은 비 객체로 정의됩니다.젠 토토B NULL, Traversal은 진행할 수 없으므로 오류가 발생하고 거래가 중단됩니다.

구문 구문의 예 :

- 키별로 객체 값을 추출합니다
선택 ( ' "a": 1':: jsonb) [ 'a'];

- 키 경로별로 중첩 된 객체 값을 추출합니다
선택 ( ' "a":  "b":  "c": 1':: jsonb) [ 'a'] [ 'b'] [ 'c'];

- 인덱스 별 배열 요소를 추출하십시오
선택 ( '[1, "2", null]':: jsonb) [1];

- 키로 객체 값을 업데이트합니다. '1'주위의 인용문 : 지정된 인용문
- 값은 젠 토토B 유형이어야합니다.
TABLE_NAME SET SET 젠 토토B_FIELD [ '키'] = '1';

- 레코드의 젠 토토B_FIELD [ 'a'] [ 'B']가 뭔가가 있으면 오류가 발생합니다.
- 대상 이외. 예를 들어, 값  "a": 1의 숫자 값이 있습니다.
- 키의 'a'.
UPDATE TABLE_NAME SET 젠 토토B_FIELD [ 'A'] [ 'B'] [ 'C'] = '1';

- 서브 스크립팅이있는 WHERE 절을 사용하여 필터 기록. 결과 이후
- 구독은 젠 토토B이며, 비교하는 값은 젠 토토B이어야합니다.
- 이중 따옴표는 "값"을 유효한 젠 토토B 문자열로 만듭니다.
jsonb_field [ 'key'] = ' "value";에서 * table_name에서 *를 선택하십시오.

젠 토토B첨자를 통한 할당은 몇 가지 에지 케이스를 다르게 처리합니다젠 토토B_SET. 소스젠 토토B값은NULL, 첨자를 통한 할당은 마치 첨자 키에 의해 암시 된 유형 (개체 또는 배열)의 빈 젠 토토 값인 것처럼 진행됩니다.

- 젠 토토B_FIELD가 NULL 인 경우 이제  "A": 1입니다.

너무 적은 요소를 포함하는 배열에 인덱스가 지정된 경우NULL인덱스에 도달 할 수 있고 값을 설정할 수있을 때까지 요소가 추가됩니다.

- 젠 토토B_FIELD가 [] 인 경우, 이제 [NULL, NULL, 2];
- 젠 토토B_FIELD가 [0] 인 경우 이제 [0, NULL, 2]
Update Table_Name Set 젠 토토B_FIELD [2] = '2';

a젠 토토B값은 해당 첨자 (경로의 마지막 첨자로 표시된 요소가 가로 지르지 않으며 무엇이든있을 수 있음)에 따라 객체 또는 배열 인 한 값이 존재하지 않는 첨자 경로에 할당을 수락합니다. 중첩 어레이 및 객체 구조가 생성되고 이전의 경우NULL-할당 된 값을 배치 할 때까지 첨자 경로에 의해 지정된대로..

- 젠 토토B_FIELD가  인 경우, 이제  "a": [ "b": 1]입니다.

8.14.6. 변환#

|젠 토토Btype for different procedural languages.

pl/perl의 확장자가라고합니다.젠 토토B_PLPERLand젠 토토B_PLPERLU. 사용하면젠 토토B값은 적절하게 Perl 어레이, 해시 및 스칼라에 매핑됩니다.

pl/python의 확장자가입니다.젠 토토B_PLPYTHON3U. 사용하면젠 토토B값은 Python 사전, 목록 및 스칼라에 매핑됩니다.

이 확장자,젠 토토B_PLPERL고려신뢰할 수있는Create현재 데이터베이스의 권한. 나머지는 설치를 위해서는 슈퍼 유저 권한이 필요합니다.

8.14.7. jsonpath 유형#

the젠 토토PATH유형은 SQL/젠 토토 경로 언어에 대한 지원을 구현합니다PostgreSQL젠 토토 데이터를 효율적으로 쿼리하려면. SQL/젠 토토 쿼리 기능으로 추가 처리하기 위해 젠 토토 데이터에서 경로 엔진에 의해 검색 될 항목을 지정하는 구문 분석 된 SQL/젠 토토 경로 표현식의 이진 표현을 제공합니다..

SQL/젠 토토 경로의 의미론은 일반적으로 SQL을 따릅니다. 동시에 젠 토토 데이터를 사용하는 자연스러운 방법을 제공하기 위해 SQL/젠 토토 PATH SYNTAX는 일부 JavaScript 컨벤션을 사용합니다.

  • dot (.)) 멤버 액세스에 사용됩니다.

  • 스퀘어 브래킷 ([]) 배열 액세스에 사용됩니다.

  • SQL/젠 토토 어레이는 1부터 시작하는 일반 SQL 어레이와 달리 0 관계입니다.

SQL/젠 토토 경로 표현식의 숫자 리터럴은 JavaScript 규칙을 따릅니다. 예를 들어, SQL/젠 토토 경로는를 허용합니다..1and1., 젠 토토에서 유효하지 않습니다. 예를 들어 비 시대의 정수 리터럴 및 밑줄 분리기가 지원됩니다 (예 :1_000_000, 0x1eee_ffff, 0o273, 0B100101. SQL/젠 토토 PATH (및 JavaScript에서는 SQL에 적합하지 않음)에서 Radix Prefix 직후에 밑줄 분리기가 있어야합니다.

SQL/젠 토토 경로 표현식은 일반적으로 SQL 쿼리로 SQL 문자열 리터럴로 작성되므로 단일 따옴표로 둘러싸여 있어야하며 값 내에서 원하는 단일 따옴표는 두 배가되어야합니다 (참조섹션 4.1.2.1). 경로 표현식의 일부 형태는 그 안에 문자열 리터럴이 필요합니다. 이 내장 된 문자 리터럴은 JavaScript/ecmascript 컨벤션을 따릅니다. 이중 인용문으로 둘러싸여 있어야하며, 백 슬래시 탈출은 그 안에 사용될 수 있습니다. 특히, 임베디드 스트링 문자 내에서 이중 견적을 쓰는 방법은입니다.\ ", 그리고 백 슬래시 자체를 작성하려면\\. 다른 특수 백 슬래시 시퀀스는 JavaScript 문자열로 인식되는 것들이 포함됩니다.\ b, \ f, \ n, \ r, \ t, \ V다양한 ASCII 제어 문자의 경우\ xNN두 개의 16 진수로 작성된 문자 코드의 경우\ unnnn4-Hex-Digit 코드 포인트로 식별 된 유니 코드 문자 및\ un ...1 ~ 6 개의 16 진수로 작성된 유니 코드 문자 코드 포인트의 경우

경로 표현식은 다음 중 하나 일 수있는 일련의 경로 요소로 구성됩니다.

  • 젠 토토 원시 유형의 경로 리터럴 : 유니 코드 텍스트, 숫자, True, False 또는 Null.

  • 경로 변수에 나열표 8.24.

  • 액세서 운영자에 등재표 8.25.

  • 젠 토토PATH운영자 및 메소드에 나열된섹션 9.16.2.3.

  • Parentheses, which can be used to provide filter expressions or define the order of path evaluation.

사용에 대한 자세한 내용젠 토토PATHSQL/젠 토토 쿼리 기능이있는 표현식, 참조섹션 9.16.2.

표 8.24. 젠 토토PATH변수

가변 설명
$ 젠 토토 값을 쿼리하는 변수 (컨텍스트 항목).
$ varname 이름 변수. 그 값은 매개 변수에 의해 설정 될 수 있습니다vars여러 젠 토토 처리 기능; 보다표 9.51자세한 내용.
@ 필터 표현식에서 경로 평가 결과를 나타내는 변수.

표 8.25. 젠 토토PATHAccessors

액세서 연산자 설명

.

. "$varname"

지정된 키가있는 객체 멤버를 반환하는 멤버 액세서. 키 이름이 일치하는 경우로 시작하는 일부 이름 변수$또는 식별자에 대한 JavaScript 규칙을 충족하지 않으므로 문자열 리터럴을 만들려면 이중 인용문으로 둘러싸여 있어야합니다..

.*

현재 객체의 최상위 레벨에있는 모든 멤버의 값을 반환하는 WildCard 회원 액세서.

.**

현재 객체의 젠 토토 계층 구조를 처리하고 둥지 레벨에 관계없이 모든 멤버 값을 반환하는 재귀 와일드 카드 멤버 액세서. 이것은입니다.PostgreSQLSQL/젠 토토 표준 확장.

. **레벨

. **start_leveltoend_level

좋아요.**그러나 지정된 수준의 젠 토토 계층 만 선택합니다. 중첩 레벨은 정수로 지정됩니다. 레벨 0은 현재 객체에 해당합니다. 가장 낮은 중첩 레벨에 액세스하려면를 사용할 수 있습니다.Last키워드. 이것은입니다.PostgreSQLSQL/젠 토토 표준 확장.

[첨자, ...]

배열 요소 액세서.첨자두 가지 형태로 제공 될 수 있습니다 :색인또는start_indextoend_index. 첫 번째 양식은 인덱스별로 단일 배열 요소를 반환합니다. 두 번째 양식은 제공된 인덱스 범위별로 배열 슬라이스를 반환합니다.start_indexend_index.

지정된index는 정수 일뿐 만 아니라 단일 숫자 값을 반환하는 표현식 일 수 있으며, 이는 자동으로 정수로 캐스팅됩니다. 인덱스 제로는 첫 번째 배열 요소에 해당합니다. 당신은 또한를 사용할 수 있습니다.마지막마지막 배열 요소를 표시하는 키워드로 알려지지 않은 길이의 배열을 처리하는 데 유용합니다.

[*]

모든 배열 요소를 반환하는 와일드 카드 어레이 요소 액세서.




[7]이 목적의 경우 용어value배열 요소가 포함되지만 젠 토토 용어는 때때로 객체 내의 값과 구별되는 배열 요소를 고려합니다.