이 문서는 지원되지 않는 버전의 PostgreSQL을위한 것입니다.
당신은에 대해 같은 페이지를 볼 수 있습니다3_스포츠 토토 베이 결과3버전 또는 위에 나열된 다른 지원 버전 중 하나입니다.

9.15. 토토 베이 기능 및 운영자

이 섹션은 다음을 설명합니다.

  • 토토 베이 데이터 처리 및 생성을위한 기능 및 연산자

  • SQL/토토 베이 PATH LANGUAGE

SQL/토토 베이 표준에 대해 자세히 알아 보려면 참조[SQLTR-19075-6]. 지원되는 토토 베이 유형에 대한 자세한 내용은postgresql, 참조PostgreSQL : 문서 : 12 : 8.14. 무지개 토토 베이 유형.

9.15.1. 토토 베이 데이터 처리 및 생성

표 9.44토토 베이 데이터 유형과 함께 사용할 수있는 연산자를 보여줍니다 (참조PostgreSQL : 문서 : 12 : 8.14. 무지개 토토 베이 유형).

표 9.44. 토토 베이and토토 베이B운영자

운영자 오른쪽 피연산자 유형 반환 유형 설명 example 예제 결과
- int 토토 베이또는토토 베이B 토토 베이 배열 요소 가져 오기 (0에서 인덱스, 끝에서 음수 정수 수) '[ "a": "foo", "b": "bar", "c": "baz"]':: 토토 베이- 2 "c": "baz"
- 텍스트 토토 베이또는토토 베이B key에 의해 토토 베이 객체 필드 가져 오기 ' "a": "b": "foo"':: 토토 베이- 'a' "b": "foo"
- int 텍스트 토토 베이 배열 요소 as텍스트 '[1,2,3]':: 토토 베이- 2 3
- 텍스트 텍스트 토토 베이 객체 필드를 가져옵니다.텍스트 ' "A": 1, "B": 2':: 토토 베이- 'B' 2
# 텍스트 [] 토토 베이또는토토 베이B 지정된 경로에서 토토 베이 개체 가져 오기 ' "a": "b": "c": "foo"':: 토토 베이# 'a, b' "C": "foo"
# 텍스트 [] 텍스트 지정된 경로에서 토토 베이 오브젝트를 가져옵니다텍스트 ' "A": [1,2,3], "B": [4,5,6]':: 토토 베이# 'a, 2' 3

Note

두 연산자의 평행 변형이 있습니다.토토 베이and토토 베이B유형. 필드/요소/경로 추출 연산자는 왼쪽 입력과 동일한 유형을 반환합니다 (하나토토 베이또는토토 베이B), 반환으로 지정된 것을 제외하고.텍스트, 값을 텍스트로 강요합니다. 토토 베이 입력에 요청과 일치 할 올바른 구조가없는 경우 필드/요소/경로 추출 연산자는 실패하지 않고 NULL을 반환합니다. 예를 들어 그러한 요소가 존재하지 않는 경우. 정수 토토 베이 배열 위트 스크립트를 허용하는 필드/요소/경로 추출 연산자는 모두 배열 끝에서 음수 첨자를 지원합니다.

표준 비교 연산자표 9.1|토토 베이B, 그러나토토 베이. 그들은 다음에 요약 된 B-tree 운영에 대한 주문 규칙을 따릅니다섹션 8.14.4. 참조 참조PostgreSQL : 문서 : 12 : 9.20. 윈 토토 기능집계 함수의 경우토토 베이_AGG값을 토토 베이, 집계 함수로 기록하는 집계토토 베이_object_agg어떤 값을 토토 베이 객체에 집계하고토토 베이B등가,토토 베이B_AGGand토토 베이B_OBJECT_AGG.

일부 추가 연산자도에만 존재합니다토토 베이B,표 9.45. 이러한 연산자 중 다수는에 의해 색인을 색인화 할 수 있습니다.토토 베이B운영자 클래스. 에 대한 전체 설명토토 베이B격리 및 존재 의미, 참조섹션 8.14.3. 섹션 8.14.4이러한 연산자가 어떻게 효과적으로 색인을 사용하는지 설명토토 베이B데이터.

표 9.45. 추가의토토 베이B연산자

운영자 오른쪽 피연산자 유형 설명 example
@ 토토 베이B 왼쪽 토토 베이 값에는 최상위 수준의 오른쪽 토토 베이 경로/값 항목이 포함되어 있습니까? ' "a": 1, "b": 2':: 토토 베이b @ ' "b": 2':: 토토 베이b
<@ 토토 베이B 왼쪽 토토 베이 경로/값 항목은 오른쪽 토토 베이 값 내에서 최상위 레벨에 포함되어 있습니까? ' "b": 2':: jsonb <@ ' "a": 1, "b": 2':: jsonb
? 텍스트 String토토 베이 값 내에서 최상위 키로 존재합니까? ' "a": 1, "b": 2':: 토토 베이b? '비'
? | 텍스트 [] 이 배열을 수행문자열최상위 키로 존재합니까? ' "a": 1, "b": "2,"c ": 3':: jsonb? | | 배열 [ 'b', 'c']
? & 텍스트 [] 이 모든 배열을 수행문자열최상위 키로 존재합니까? '[ "A", "B"]':: 토토 베이B? & ARRAY [ 'A', 'B']
|| 토토 베이B 두 가지토토 베이B새로운 값토토 베이Bvalue '[ "A", "B"]':: 토토 베이B || '[ "C", "D"]' ':: 토토 베이B
- 텍스트 키/값 쌍 삭제 또는String왼쪽 피연산자의 요소. 키/값 쌍은 키 값에 따라 일치합니다. ' "a": "b"':: 토토 베이b- 'a'
- 텍스트 [] 다중 키/값 쌍을 삭제하거나String왼쪽 피연산자의 요소. 키/값 쌍은 키 값에 따라 일치합니다. ' "a": "b", "c": "d"':: 토토 베이b- 'a, c':: text []
- 정수 지정된 인덱스로 배열 요소를 삭제합니다 (끝에서 음의 정수 수). 최상위 컨테이너가 배열이 아닌 경우 오류를 던집니다. '[ "A", "B"]':: 토토 베이B -1
#- 텍스트 [] 지정된 경로로 필드 또는 요소를 삭제합니다 (토토 베이 어레이의 경우 끝까지 음수 정수 수) '[ "a", "b": 1]':: jsonb #- '1, b'
@? 토토 베이PATH 토토 베이 PATH가 지정된 토토 베이 값에 대한 항목을 반환합니까? ' "A": [1,2,3,4,5]':: 토토 베이B @? '$ .a [*]? (@ 2) '
@@ 토토 베이PATH 지정된 토토 베이 값에 대한 토토 베이 PATH PRECTICE의 결과를 반환합니다. 결과의 첫 번째 항목 만 고려됩니다. 결과가 부울하지 않으면NULL반품. ' "a": [1,2,3,4,5]':: jsonb @@ '$ .a [*] 2'

Note

the||연산자는 키의 결합을 포함하는 개체를 생성하여 두 개의 토토 베이 객체를 연결하여 중복 키가있을 때 두 번째 객체의 값을 취합니다. 다른 모든 경우는 토토 베이 어레이를 생성합니다. 첫째, 비 어레이 입력이 단일 요소 배열로 변환 된 다음 두 배열이 연결됩니다. 그것은 재귀 적으로 작동하지 않습니다. 최상위 배열 또는 객체 구조 만 병합됩니다.

Note

the@?and@@연산자는 다음 오류를 억제합니다. 객체 필드 또는 배열 요소, 예기치 않은 토토 베이 항목 유형 및 숫자 오류. 이 동작은 다양한 구조의 토토 베이 문서 모음을 검색하는 동안 도움이 될 수 있습니다.

표 9.46작성에 사용할 수있는 기능을 표시토토 베이and토토 베이B값. (에 대한 동등한 함수는 없습니다토토 베이B,row_to_토토 베이andarray_to_토토 베이기능. 그러나TO_토토 베이B함수는 이러한 함수와 거의 동일한 기능을 제공합니다.)

표 9.46. 토토 베이 제작 기능

기능 설명 example 예제 결과

TO_토토 베이 (Anylement)

TO_토토 베이B (Anylement)

값을 다시 반환합니다토토 베이또는토토 베이B. 배열 및 복합재는 어레이 및 객체로 (재귀 적으로) 변환됩니다. 그렇지 않으면 유형에서로 캐스트가있는 경우토토 베이, 캐스트 함수는 변환을 수행하는 데 사용됩니다. 그렇지 않으면 스칼라 값이 생성됩니다. 숫자, 부울 또는 널 값 이외의 스칼라 유형의 경우 텍스트 표현이 유효한 방식으로 사용됩니다토토 베이또는토토 베이Bvalue. TO_토토 베이 ( '프레드는 "안녕하세요."':: 텍스트) "Fred Said \"Hi. \ ""
array_to_토토 베이 (anyArray [, pretty_bool]) 배열을 토토 베이 배열로 반환합니다. PostgreSQL 다차원 배열은 토토 베이 배열 배열이됩니다. 라인 피드는 Dimension-1 요소간에 추가됩니다.pretty_bool진실입니다. array_to_토토 베이 ( '1,5, 99,100':: int []) [[1,5], [99,100]]
row_to_토토 베이 (레코드 [, pretty_bool]) 행을 토토 베이 객체로 반환합니다. 라인 피드는 레벨 1 요소간에 추가됩니다.pretty_bool진실입니다. row_to_토토 베이 (Row (1, 'foo')) "f1": 1, "f2": "foo"

토토 베이_build_array (variadic "any")

토토 베이B_BUILD_ARRAY (variadic "any")

variadic 인수 목록에서 아마도 이질적인 토토 베이 배열을 구축합니다. 토토 베이_BUILD_ARRAY (1,2, '3', 4,5) [1, 2, "3", 4, 5]

토토 베이_build_object (variadic "any")

토토 베이b_build_object (variadic "any")

Variadic 인수 목록에서 토토 베이 객체를 빌드합니다. 컨벤션별로, 인수 목록은 교대 키와 값으로 구성됩니다. 토토 베이_build_object ( 'foo', 1, 'bar', 2) "foo": 1, "bar": 2

토토 베이_object (text [])

토토 베이b_object (text [])

텍스트 배열에서 토토 베이 객체를 빌드합니다. 배열에는 짝수의 멤버가있는 정확한 1 차원이 있어야하며,이 경우 각각의 내부 배열이 정확히 두 개의 요소를 갖도록 키/값 쌍으로 간주되도록 두 차원으로 간주됩니다..

토토 베이_object ( 'a, 1, b, "def", c, 3.5')

토토 베이_object ( 'a, 1, b, "def", c, 3.5')

"a": "1", "b": "def", "c": "3.5"

토토 베이_object (keys text [], 값 text [])

토토 베이b_object (keys text [], 값 text [])

이 형태의토토 베이_object두 개의 별도 배열에서 키와 값을 쌍으로 가져옵니다. 다른 모든 측면에서 그것은 하나의 변호 형식과 동일합니다. 토토 베이_object ( 'a, b', '1,2') "A": "1", "B": "2"

Note

array_to_토토 베이androw_to_토토 베이동일한 동작to_토토 베이꽤 인쇄 옵션을 제공하지 않는 경우. 설명 된 행동TO_토토 베이마찬가지로 다른 토토 베이 생성 기능에 의해 변환 된 각 개별 값에 적용됩니다.

Note

thePostgreSQL : 문서 : 12 : F.16. 와이즈Extension은에서 캐스트되었습니다.hstoreto토토 베이HSTORE토토 베이 생성 함수를 통해 변환 된 값은 원시 문자열 값이 아닌 토토 베이 객체로 표시됩니다.

표 9.47처리 할 수있는 기능을 표시토토 베이and토토 베이B값.

표 9.47. 토토 베이 처리 기능

기능 반환 유형 설명 example 예제 결과

토토 베이_array_length (토토 베이)

토토 베이B_ARRAY_LENGTH (토토 베이B)

int 가장 바깥 쪽 토토 베이 어레이의 요소 수를 반환합니다. 토토 베이_array_length ( '[1,2,3, "f1": 1, "f2": [5,6], 4]') 5

토토 베이_each (토토 베이)

토토 베이B_EACH (토토 베이B)

키 텍스트 설정, 값 토토 베이

키 텍스트 설정, 값 토토 베이B

가장 바깥 쪽 토토 베이 객체를 키/값 쌍 세트로 확장합니다. 선택 *에서 토토 베이_EACH ( ' "a": "foo", "b": "bar"')
키 | 값
-----+-------
 A | "foo"
 B | "술집"

토토 베이_each_text (토토 베이)

토토 베이B_ECH_TEXT (토토 베이B)

키 텍스트 설정, 값 텍스트 가장 바깥 쪽 토토 베이 객체를 키/값 쌍 세트로 확장합니다. 반환 된 값은 유형입니다텍스트. 토토 베이_each_text ( ' "a": "foo", "b": "bar"')에서 선택 * 선택 *
키 | 값
-----+-------
 A | foo
 B | 술집

토토 베이_extract_path (from_토토 베이 토토 베이, variadic path_elems text [])

토토 베이b_extract_path (from_토토 베이 토토 베이b, variadic path_elems text [])

토토 베이

토토 베이B

path_elems(동등한#운영자). 토토 베이_extract_path ( ' "f2": "f3": 1, "f4": "f5": 99, "f6": "foo"', 'f4') "f5": 99, "f6": "foo"

json_extract_path_text (from_json json, variadic path_elems text [])

jsonb_extract_path_text (from_json jsonb, variadic path_elems text [])

텍스트 path_elemsas텍스트(동등한#운영자). json_extract_path_text ( ' "f2": "f3": 1, "f4": "f5": 99, "f6": "foo"', 'f4', 'f6') foo

토토 베이_object_keys (json)

토토 베이b_object_keys (토토 베이b)

텍스트 설정 가장 바깥 쪽 토토 베이 객체에서 키 세트를 반환합니다. 토토 베이_object_keys ( ' "f1": "abc", "f2": "f3": "a", "f4": "b"')
토토 베이_object_keys
-----------------
 F1
 F2

토토 베이_POPULE_RECORD (BASE AYLENMENT, FROM_토토 베이 토토 베이)

토토 베이B_POPULE_RECORD (BASE AYLENMENT, FROM_토토 베이 토토 베이B)

Anylement 객체를 확장합니다From_토토 베이열이 열이 정의 된 레코드 유형과 일치하는 행으로Base(아래 참고 참조). 토토 베이_populate_record에서 * 선택 * 선택 *에서 선택 * 선택
a |   B |      기음
---+-----------+------------
 1 | 2, "a b" | (4, "A B C")

json_populate_recordset (base anylement, from_json json)

토토 베이B_POPULE_RECORDSET (BASE AYLENMENT, FROM_토토 베이 토토 베이B)

모든 요소 설정 객체의 가장 바깥 쪽 배열을 확장From_토토 베이열이 정의 된 레코드 유형과 일치하는 행 세트에Base(아래 참고 참조). 토토 베이_populate_recordset에서 * 선택 * 선택 *
a | 비
---+---
 1 | 2
 3 | 4

토토 베이_array_elements (토토 베이)

토토 베이B_ARRAY_ELEMENTS (토토 베이B)

토토 베이 SETOF

setof jsonb

토토 베이 배열을 토토 베이 값 세트로 확장합니다. 선택 *에서 토토 베이_array_elements ( '[1, true, [2, false]' ')
값
----------
 1
 진실
 [2, false]

토토 베이_array_elements_text (토토 베이)

토토 베이B_ARRAY_ELEMENTS_TEXT (토토 베이B)

텍스트 설정 토토 베이 배열을 세트로 확장합니다텍스트값. 선택 *에서 json_array_elements_text ( '[ "foo", "bar"]')
값
----------
 foo
 술집

토토 베이_TYPEOF (토토 베이)

토토 베이B_TYPEOF (토토 베이B)

텍스트 가장 바깥 쪽 json 값의 유형을 텍스트 문자열로 반환합니다. 가능한 유형은개체, 배열, String, 번호, 부울NULL. 토토 베이_typeof ( '-123.4') 번호

토토 베이_TO_RECORD (토토 베이)

토토 베이B_TO_RECORD (토토 베이B)

레코드 토토 베이 객체에서 임의의 레코드를 작성합니다 (아래 참고 참조). 모든 기능이 반환되는 것과 마찬가지로레코드, 발신자는 레코드의 구조를 AN으로 명시 적으로 정의해야합니다as절. json_to_record에서 * 선택 *에서 선택 * 선택 * json_to_record ( ' "a": 1, "b": [1,2,3], "c": [1,2,3], "e": "bar", "r": "a": 123, "b": "a b c"') x (a int, b int, c int, c int) myrowtype)
a |    B |    C | d |       아르 자형
---+--------+--------+---+-------------
 1 | [1,2,3] | 1,2,3 |   | (123, "A B C")

토토 베이_TO_RECORDSET (토토 베이)

토토 베이B_TO_RECORDSET (토토 베이B)

기록 토토 베이 배열로부터 임의의 레코드 세트를 작성합니다 (아래 참고 참조). 모든 기능이 반환되는 것과 마찬가지로레코드, 발신자는 레코드의 구조를 AN으로 명시 적으로 정의해야합니다as절. json_to_recordset ( '[ "a": 1, "b": "foo", "a": "2", "c": "bar"]'))))));
a |  비
---+-----
 1 | foo
 2 |

토토 베이_STRIP_NULLS (FROM_토토 베이 토토 베이)

토토 베이B_STRIP_NULLS (FROM_토토 베이 토토 베이B)

토토 베이

토토 베이B

반환From_토토 베이null 값이 생략 된 모든 객체 필드가 ​​있습니다. 다른 널 값은 손대지 않았습니다. 토토 베이_STRIP_NULLS ( '[ "f1": 1, "f2": null, 2, null, 3]') [ "f1": 1, 2, null, 3]

토토 베이B_SET (Target 토토 베이B, PATH TEXT [], NEW_VALUE 토토 베이B [, create_missing boolean])

토토 베이B

반환대상PATH대체new_value또는new_valueif 추가create_missingtrue (기본값은true) 및 지정된 항목PATH존재하지 않습니다. 경로 지향 연산자와 마찬가지로,에 나타나는 부정적인 정수PATH토토 베이 어레이의 끝에서 카운트.

토토 베이B_SET ( '[ "f1": 1, "f2": null, 2, null, 3],'0, f1 ','[2,3,4] ', false)

토토 베이B_SET ( '[ "f1": 1, "f2": null, 2]', '0, f3', '[2,3,4]')

[ "f1": [2,3,4], "f2": null, 2, null, 3]

[ "f1": 1, "f2": null, "f3": [2, 3, 4], 2]

토토 베이B_INSERT (Target 토토 베이B, PATH TEXT [], NEW_VALUE 토토 베이B [, insert_after boolean])

토토 베이B

반환대상withnew_value삽입. 만약에대상섹션에 의해 지정된PATHjsonb 배열에 있습니다.new_value대상 전 또는 IF 이후에 삽입됩니다insert_aftertrue (기본값은거짓). 만약에대상섹션에 의해 지정된 섹션PATH토토 베이b 객체에 있습니다.new_value대상존재하지 않습니다. 경로 지향 연산자와 마찬가지로,에 나타나는 부정적인 정수Path토토 베이 어레이의 끝에서 카운트.

토토 베이B_INSERT ( ' "a": [0,1,2]', 'a, 1', ' "new_value"')

토토 베이B_INSERT ( ' "a": [0,1,2]', 'a, 1', ' "new_value"', true)

"a": [0, "new_value", 1, 2]

"a": [0, 1, "new_value", 2]

토토 베이B_PRETTY (FROM_토토 베이 토토 베이B)

텍스트

반환From_토토 베이들여 쓰기 토토 베이 텍스트 토토 베이B_PRETTY ( '[ "f1": 1, "f2": null, 2, null, 3]')
[

        "F1": 1,
        "F2": NULL
    ,
    2,
    널,
    3
]

토토 베이B_PATH_EXISSS (Target 토토 베이B, PATH 토토 베이PATH [, vars 토토 베이B [, 사일런트 부울]])

부울 토토 베이 PATH가 지정된 토토 베이 값에 대해 항목을 반환하는지 확인합니다.

토토 베이b_path_exists ( ' "a": [1,2,3,4,5]', '$ .a [*]? ( @ = $ min && <= $ max)', ' "min": 2, "max": 4')

true

토토 베이B_PATH_MATCH (Target 토토 베이B, PATH 토토 베이PATH [, vars 토토 베이b [, 사일런트 부울]])

부울 지정된 토토 베이 값에 대한 토토 베이 PATH PRECTICE 결과를 반환합니다. 결과의 첫 번째 항목 만 고려됩니다. 결과가 부울하지 않으면NULL반환됩니다.

토토 베이b_path_match ( ' "a": [1,2,3,4,5]', '존재 ($. A [*]?

true

토토 베이B_PATH_QUERY (Target 토토 베이B, PATH 토토 베이PATH [, vars 토토 베이B [, Silent Bool]])

setof jsonb 지정된 토토 베이 값에 대해 토토 베이 경로에 의해 반환 된 모든 토토 베이 항목을 가져옵니다.

토토 베이b_path_query ( ' "a": [1,2,3,4,5]', '$ .a [ *]?

토토 베이B_PATH_QUERY
-----------------
 2
 3
 4

토토 베이B_PATH_QUERY_ARRAY (Target 토토 베이B, PATH 토토 베이PATH [, vars 토토 베이B [, Silent bool]])

토토 베이B 지정된 토토 베이 값에 대해 토토 베이 PATH에 의해 반환 된 모든 토토 베이 항목을 가져옵니다.

토토 베이b_path_query_array ( ' "a": [1,2,3,4,5]', '$ .a [*]? ( @ = $ min && <= $ max)', ' "min": 2, "max": 4')

[2, 3, 4]

토토 베이B_PATH_QUERY_FIRST (Target 토토 베이B, PATH 토토 베이PATH [, vars 토토 베이B [, Silent bol]])

토토 베이B 지정된 토토 베이 값에 대해 토토 베이 경로에 의해 반환 된 첫 번째 토토 베이 항목을 가져옵니다. 보고NULL결과 없음.

토토 베이B_PATH_QUERY_FIRST ( ' "a": [1,2,3,4,5]', '$ .a [*]?

2


Note

이러한 기능과 연산자 중 다수는 토토 베이 문자열의 유니 코드 이스케이프를 적절한 단일 문자로 변환합니다. 입력이 유형 인 경우 문제가 아닌 경우토토 베이B, 전환이 이미 완료 되었기 때문에; 하지만토토 베이입력, 이로 인해 언급 된대로 오류가 발생할 수 있습니다.PostgreSQL : 문서 : 12 : 8.14. 무지개 토토 베이 유형.

Note

함수토토 베이 [B] _populate_record, 토토 베이 [B] _populate_recordset, 토토 베이 [B] _TO_RECORD토토 베이 [B] _TO_RECORDSET토토 베이 객체 또는 객체 배열에서 작동하고 이름이 출력 행 유형의 열 이름과 일치하는 키와 관련된 값을 추출합니다. 출력 열 이름에 해당하지 않는 객체 필드는 무시되며 객체 필드와 일치하지 않는 출력 열에는 널로 채워집니다. 토토 베이 값을 SQL 유형의 출력 열로 변환하려면 다음 규칙이 순서대로 적용됩니다.

  • 토토 베이 NULL 값은 모든 경우에 SQL NULL로 변환됩니다.

  • 출력 열이 유형 인 경우토토 베이또는토토 베이B, 토토 베이 값은 정확히 재현되었습니다.

  • 출력 열이 합성 (행) 유형이고 토토 베이 값이 토토 베이 객체 인 경우 객체의 필드는이 규칙의 재귀 적 응용에 의해 출력 행 유형의 열로 변환됩니다..

  • 마찬가지로 출력 열이 배열 유형이고 토토 베이 값이 토토 베이 배열 인 경우 토토 베이 배열의 요소는이 규칙의 재귀 적 응용에 의해 출력 배열의 요소로 변환됩니다..

  • 그렇지 않으면, 토토 베이 값이 문자열 문자 인 경우 문자열의 내용은 열의 데이터 유형의 입력 변환 함수에 공급됩니다..

  • 그렇지 않으면, 토토 베이 값의 일반 텍스트 표현은 열의 데이터 유형의 입력 변환 함수에 공급됩니다.

이러한 함수의 예제는 상수를 사용하는 반면, 일반적인 사용은에서 테이블을 참조하는 것입니다.From절 중 하나를 사용하고 그 중 하나를 사용하십시오토토 베이또는토토 베이B함수에 대한 인수로서 열. 그런 다음 추출 된 주요 값은 쿼리의 다른 부분에서 참조 할 수 있습니다.어디절 및 대상 목록. 이러한 방식으로 여러 값을 추출하면 키 당 연산자와 별도로 추출하는 것보다 성능이 향상 될 수 있습니다.

Note

의 모든 항목PATH매개 변수토토 베이B_SET뿐만 아니라토토 베이B_INSERT마지막 항목을 제외하고대상. 만약에create_missing거짓입니다.PATH매개 변수토토 베이B_SET있어야합니다. 이러한 조건이 충족되지 않으면대상변경되지 않은 반품.

마지막 경로 항목이 객체 키 인 경우, 새로운 값이 없으면 생성됩니다. 마지막 경로 항목이 배열 인덱스 인 경우 양수 인 경우 설정할 항목은 왼쪽에서 계산하여 찾아서 오른쪽에서 계산하여 음수 인 경우 --1가장 오른쪽 요소 등을 지정합니다. 항목이 범위를 벗어난 경우 -array_length.

Note

the토토 베이_typeof기능NULL반환 값은 SQL NULL과 혼동해서는 안됩니다. 전화하는 동안토토 베이_typeof ( 'null':: json)복귀 할 것입니다NULL, Calling토토 베이_typeof (null :: json)SQL NULL을 반환합니다.

Note

인수가토토 베이_STRIP_NULLS모든 객체에 중복 필드 이름을 포함하면 결과가 발생하는 순서에 따라 의미 적으로 다소 다를 수 있습니다. 이것은에 대한 문제가 아닙니다.토토 베이B_STRIP_NULLS이후토토 베이B57397_57447

Note

the토토 베이b_path_exists, 토토 베이B_PATH_MATCH, 토토 베이B_PATH_QUERY, 토토 베이B_PATH_QUERY_ARRAY토토 베이B_PATH_QUERY_FIRST함수는 선택 사항이 있습니다varsandSilent인수.

인 경우vars인수가 지정되어 있습니다. a로 대체 할 지명 된 변수가 포함 된 객체를 제공합니다토토 베이PATH표현.

Silent인수가 지정되어 있으며true값, 이러한 함수는와 동일한 오류를 억제합니다.@?@@연산자.

9.15.2. SQL/토토 베이 Path Language

SQL/토토 베이 경로 표현식 XML에 대한 SQL 액세스에 사용되는 XPath 표현식과 유사한 토토 베이 데이터에서 검색 할 항목을 지정합니다. 안에PostgreSQL, 경로 표현식은로 구현됩니다.토토 베이PATH데이터 유형 및에 설명 된 요소를 사용할 수 있습니다섹션 8.14.6.

토토 베이 쿼리 함수 및 연산자가 제공된 경로 표현식을 전달합니다경로 엔진평가 용. 표현식이 쿼리 된 토토 베이 데이터와 일치하면 해당 SQL/토토 베이 항목이 반환됩니다. 경로 표현식은 SQL/토토 베이 Path Language로 작성되며 산술 표현 및 기능도 포함 할 수도 있습니다. 쿼리 함수 제공된 표현식을 텍스트 문자열로 취급하므로 단일 따옴표로 둘러싸여 있어야합니다.

경로 표현식은에 의해 허용되는 일련의 요소로 구성됩니다.토토 베이PATH데이터 유형. 경로 표현식은 왼쪽에서 오른쪽으로 평가되지만 괄호를 사용하여 작업 순서를 변경할 수 있습니다. 평가가 성공하면 SQL/토토 베이 항목 시퀀스 (SQL/토토 베이 시퀀스)가 생성되고 평가 결과가 지정된 계산을 완료하는 토토 베이 쿼리 기능으로 반환됩니다.

쿼리 할 토토 베이 데이터를 참조하려면 (컨텍스트 항목), 사용$경로 표현식에 로그인하십시오. 한 명 이상이 뒤 따릅니다액세서 연산자, 컨텍스트 항목의 내용을 검색하기 위해 토토 베이 구조 레벨을 레벨별로 내려갑니다. 다음에 나오는 각 연산자는 이전 평가 단계의 결과를 다룹니다.

예를 들어, 다음과 같이 구문 분석하려는 GPS 추적기의 토토 베이 데이터가 있다고 가정합니다.

"길": 
    "세그먼트": [

        "위치": [47.763, 13.4034],
        "시작 시간": "2018-10-14 10:05:14",
        "HR": 73
      ,

        "위치": [47.706, 13.2635],
        "시작 시간": "2018-10-14 10:39:21",
        "HR": 135

    ]]

사용 가능한 트랙 세그먼트를 검색하려면를 사용해야합니다..이전의 모든 토토 베이 개체에 대한 액세서 연산자 :

'$. track.segments'

검색 할 항목이 배열의 요소 인 경우를 사용 하여이 배열을 해제해야합니다.[*]운영자. 예를 들어, 다음 경로는 사용 가능한 모든 트랙 세그먼트의 위치 좌표를 반환합니다.

'$. track.segments [*]. 위치'

첫 번째 세그먼트의 좌표 만 반환하려면 해당 첨자를 지정할 수 있습니다.[]액세서 연산자. SQL/토토 베이 어레이는 0과 관련이 있습니다.

'$. track.segments [0] .location'

각 경로 평가 단계의 결과는 하나 이상으로 처리 할 수 ​​있습니다토토 베이PATH운영자 및 메소드에 나열섹션 9.15.2.3. 각 메소드 이름에는 점이 뒤 바져 있어야합니다. 예를 들어 배열 크기를 얻을 수 있습니다.

'$. track.segments.size ()

사용의 더 많은 예는토토 베이PATH경로 표현식 내의 연산자 및 메소드, 참조섹션 9.15.2.3.

경로를 정의 할 때 하나 이상을 사용할 수도 있습니다필터 표현식그와 유사한 작동여기서SQL의 조항. 필터 표현식은 물음표로 시작하여 괄호로 조건을 제공합니다.

? (조건)

필터 표현식은 적용되는 경로 평가 단계 직후에 지정해야합니다. 이 단계의 결과는 제공된 조건을 만족시키는 항목 만 포함하도록 필터링됩니다. SQL/토토 베이은 3 값 논리를 정의하므로 조건이 될 수 있습니다true, 거짓또는알 수없는. 그만큼알 수없는값은 SQL과 같은 역할을합니다null알 수 없음술어. 추가 경로 평가 단계는 필터 표현식이 반환되는 항목 만 사용합니다true.

필터 표현식에 사용할 수있는 기능 및 연산자표 9.49. 필터링되는 경로 평가 결과는로 표시됩니다.@변수. 더 낮은 둥지 레벨에 저장된 토토 베이 요소를 참조하려면 이후에 한 명 이상의 액세서 연산자를 추가하십시오.@.

130보다 높은 모든 심박수 값을 검색하고 싶다고 가정합니다. 다음 표현을 사용하여이를 달성 할 수 있습니다..

'$. track.segments [*]. hr? (@ 130) '

대신 그러한 값으로 세그먼트의 시작 시간을 얻으려면 대신 시작 시간을 반환하기 전에 관련없는 세그먼트를 필터링해야하므로 필터 표현식이 이전 단계에 적용되며 조건에 사용 된 경로는 다음과 같습니다.

'$. track.segments [*]? (@.hr 130). "시작 시간" '

필요한 경우 동일한 중첩 레벨에서 여러 필터 표현식을 사용할 수 있습니다. 예를 들어, 다음 표현식은 관련 좌표와 높은 심박수 값이있는 위치를 포함하는 모든 세그먼트를 선택합니다.

'$. track.segments [*]? (@.location [1] <13.4)? (@.hr 130). "시작 시간" '

다른 둥지 레벨에서 필터 표현식을 사용하는 것도 허용됩니다. 다음 예제는 먼저 위치별로 모든 세그먼트를 필터링 한 다음 가능한 경우이 세그먼트에 대해 높은 심박수 값을 반환합니다.

'$. track.segments [*]? (@.location [1] <13.4) .hr? (@ 130) '

서로 안에 필터 표현을 중첩 할 수도 있습니다 :

'$. 트랙? (존재합니다 (@. segments [*]? (@.hr 130)). segments.size ()

이 표현식은 심박수 값이 높은 세그먼트가 포함되어 있거나 빈 시퀀스가 ​​포함 된 경우 트랙의 크기를 반환합니다..

PostgreSQL의 SQL/토토 베이 PATH Language의 구현 SQL/토토 베이 표준에서 다음 편차가 있습니다 :

  • .dateTime ()항목 방법은 아직 구현되지 않았지만 주로 불변하기 때문에토토 베이PATH함수 및 연산자는 일부 DateTime 작업에 사용되는 Session Timezone을 참조 할 수 없습니다. DateTime 지원이 추가됩니다토토 베이PATH향후 버전의PostgreSQL.

  • SQL/토토 베이 표준은 필터에서만 곤경에 처한다. 이것은 구현에 필요합니다@@운영자. 예를 들어 다음토토 베이PATH표현식이 유효합니다PostgreSQL:

    '$. track.segments [*]. hr <70'
  • 정규 표현 패턴의 해석에는 약간의 차이가 있습니다.Like_Regex필터에 설명 된대로섹션 9.15.2.2.

9.15.2.1. 엄격하고 LAX 모드

토토 베이 데이터를 쿼리 할 때 경로 표현식이 실제 토토 베이 데이터 구조와 일치하지 않을 수 있습니다. 배열의 객체 또는 요소의 존재하지 않는 멤버에 액세스하려는 시도는 구조적 오류가 발생합니다. SQL/토토 베이 경로 표현식에는 구조적 오류를 처리하는 두 가지 모드가 있습니다.

  • lax (기본값) - 경로 엔진은 쿼리 된 데이터를 지정된 경로에 암시 적으로 조정합니다. 나머지 구조적 오류는 억제되어 빈 SQL/토토 베이 시퀀스로 변환됩니다.

  • 엄격한 - 구조적 오류가 발생하면 오류가 발생합니다.

LAX 모드는 토토 베이 데이터가 예상 스키마를 준수하지 않으면 토토 베이 문서 구조 및 경로 표현식의 일치를 용이하게합니다. 피연산자가 특정 작업의 요구 사항과 일치하지 않으면이 작업을 수행하기 전에 요소를 SQL/토토 베이 시퀀스로 변환하여 자동으로 SQL/토토 베이 어레이로 랩핑하거나 포장되지 않은 상태로 만들 수 있습니다. 게다가, 비교 운영자는 LAX 모드에서 오페라를 자동으로 풀므로 SQL/토토 베이 배열을 상자 외부로 비교할 수 있습니다. 크기 1의 배열은 유일한 요소와 동일하게 간주됩니다. 자동 풀림 랩핑은 다음과 같은 경우에만 수행되지 않습니다.

  • 경로 표현식에는type ()또는size ()배열의 유형과 요소 수를 반환하는 메소드.

  • 쿼리 된 토토 베이 데이터에는 중첩 어레이가 포함되어 있습니다. 이 경우 가장 바깥 쪽 배열 만 랩핑되지 않은 반면 모든 내부 배열은 변하지 않습니다. 따라서 암시 적 풀림 랩핑은 각 경로 평가 단계에서 한 레벨 만 다운 할 수 있습니다.

예를 들어, 위에 나열된 GPS 데이터를 쿼리 할 때 LAX 모드를 사용할 때 세그먼트 배열을 저장한다는 사실을 추상화 할 수 있습니다.

'lax $ .track.segments.location'

엄격한 모드에서 지정된 경로는 쿼리 된 토토 베이 문서의 구조와 정확히 일치해야 SQL/토토 베이 항목을 반환해야 하므로이 경로 표현식을 사용하면 오류가 발생합니다. LAX 모드와 동일한 결과를 얻으려면 명시 적으로 랩을 풀어야합니다.세그먼트배열 :

'엄격한 $ .track.segments [*]. 위치'

the.**액세서는 LAX 모드를 사용할 때 놀라운 결과로 이어질 수 있습니다. 예를 들어, 다음 쿼리는 모든 것을 선택합니다HR값 두 번 :

LAX $. **. HR

이것은이기 때문에 발생합니다..**Accessor는 두 가지를 선택합니다세그먼트배열 및 각 요소, 반면.hr액세서는 LAX 모드를 사용할 때 자동으로 배열을 풀립니다. 놀라운 결과를 피하려면 사용 권장합니다..**엄격한 모드에서만 액세서. 다음 쿼리는 각각을 선택합니다HR한 번만 가치 :

엄격한 $. **. HR

9.15.2.2. 정규 표현

SQL/토토 베이 PATH 표현식 텍스트를 정기적으로 표현할 수있는Like_Regex필터. 예를 들어, 다음 SQL/토토 베이 PATH 쿼리는 영어 모음으로 시작하는 배열의 모든 문자열을 대상으로 비면적으로 일치합니다.

'$ [*]? (@ like_regex "^[aeiou]"flag "i") '

선택 사항플래그문자열은 문자 중 하나 이상을 포함 할 수 있습니다i사례에 민감한 경기,m허용^and$Newlines에서 일치하려면S허용.Newline과 일치하려면Q전체 패턴을 인용하려면 (동작을 간단한 부분 문자열 일치로 줄이기)

SQL/토토 베이 표준은 정규 표현에 대한 정의를 빌려Like_Regex운영자는 XQuery 표준을 사용합니다. PostgreSQL은 현재를 지원하지 않습니다.Like_Regex운영자. 따라서​​Like_Regex필터는에 설명 된 POSIX 정규 표현 엔진을 사용하여 구현됩니다섹션 9.7.3. 이것은 표준 SQL/토토 베이 동작의 다양한 사소한 불일치로 이어지며, 이는.섹션 9.7.3.8. 그러나 설명 된 플래그 레터 비 호환성은 SQL/토토 베이에 적용되지 않습니다. XQuery 플래그 문자가 Posix 엔진이 기대하는 것과 일치하도록 변환되므로.

의 패턴 인수를 명심하십시오.Like_Regex|섹션 8.14.6. 이는 특히 정규 표현식에서 사용하려는 백 슬래시가 두 배가되어야 함을 의미합니다. 예를 들어, 숫자 만 포함하는 루트 문서의 문자열 값과 일치하려면

$.*? (@ like_regex "^\\ d+$")

9.15.2.3. SQL/토토 베이 경로 연산자 및 방법

표 9.48토토 베이PATH. 표 9.49사용 가능한 필터 표현식 요소를 보여줍니다.

표 9.48. 토토 베이PATH운영자 및 방법

연산자/메소드 설명 토토 베이 예제 예제 쿼리 결과
+(unery) SQL/토토 베이 시퀀스를 반복하는 연산자 "x": [2.85, -14.7, -9.4] + $ .x.floor () 2, -15, -10
-(unery) SQL/토토 베이 시퀀스를 반복하는 마이너스 연산자 "x": [2.85, -14.7, -9.4] - $ .x.floor () -2, 15, 10
+(바이러스) 추가 [2] 2 + $ [0] 4
-(binary) Subtraction [2] 4- $ [0] 2
* 곱셈 [4] 2 * $ [0] 8
/ Division [8] $ [0] / 2 4
% 모듈러스 [32] $ [0] % 10 2
type () SQL/토토 베이 항목의 유형 [1, "2", ] $ [*]. type () "번호", "문자열", "개체"
size () SQL/토토 베이 항목의 크기 "m": [11, 15] $ .M.Size () 2
double () SQL/토토 베이 번호 또는 문자열에서 변환 된 근사 부동 소수점 번호 "Len": "1.9" $ .len.double () * 2 3.8
CEILING () SQL/토토 베이 번호보다 크거나 가장 가까운 정수 "H": 1.3 $ .h.ceiling () 2
floor () 가장 가까운 정수는 SQL/토토 베이 번호보다 작거나 동일합니다 "H": 1.3 $ .h.floor () 1
abs () SQL/토토 베이 번호의 절대 값 "z": -0.3 $ .z.abs () 0.3
keyValue () 3 개의 필드를 포함하는 항목의 배열로 표시되는 오브젝트의 키 값 쌍 시퀀스 ("키", "value""ID")."id"객체 키 값 쌍의 고유 식별자입니다. "x": "20", "y": 32 $ .keyValue () "키": "x", "value": "20", "id": 0, "키": "y", "value": 32, "id": 0

표 9.49. 토토 베이PATH필터 표현 요소

value/prectice 설명 토토 베이 예제 예제 쿼리 결과
== 평등 연산자 [1, 2, 1, 3] $ [*]? (@ == 1) 1, 1
! = 비평가 운영자 [1, 2, 1, 3] $ [*]? (@! = 1) 2, 3
< 비평가 연산자 (동일! =) [1, 2, 1, 3] $ [*]? (@ < 1) 2, 3
< 연산자보다 [1, 2, 3] $ [*]? (@ <2) 1
<= 적은 운영자 [1, 2, 3] $ [*]? (@ <= 2) 1, 2
더 큰 운영자 [1, 2, 3] $ [*]? (@ 2) 3
= 더 큰 운영자 [1, 2, 3] $ [*]? (@ = 2) 2, 3
true 토토 베이과 비교하는 데 사용되는 값true리터럴 [ "name": "john", "parent": "false, "name ":"chris ","parent ": true] $ [*]? (@.parent == true) "name": "chris", "parent": true
false 토토 베이과 비교하는 데 사용되는 값false리터럴 [ "name": "john", "parent": "false, "name ":"chris ","parent ": true] $ [*]? (@.parent == false) "이름": "John", "Parent": False
NULL 토토 베이과 비교하는 데 사용되는 값NULLvalue [ "name": "mary", "job": null, "name": "michael", "job": "driver"] $ [*]? (@.job == null) .name "Mary"
&& 부울 및 [1, 3, 7] $ [*]? ( @ 1 && @ <5) 3
|| 부울 또는 [1, 3, 7] $ [*]? ( @ <1 || @ 5) 7
! 부울 아님 [1, 3, 7] $ [*]? (! (@ <5)) 7
Like_Regex 첫 번째 피연산자가 두 번째 피연산자가 주어진 정규 표현과 일치하는지 여부를 테스트합니다.플래그문자 (참조섹션 9.15.2.2) [ "ABC", "ABD", "ABDC", "ABDACB", "BABC"] $ [*]? (@ like_regex "^ab.*c"flag "i") "ABC", "ABDC", "ABDACB"
시작 두 번째 피연산자가 첫 번째 피연산자의 초기 기판인지 테스트 [ "John Smith", "Mary Stone", "Bob Johnson" $ [*]? (@는 "John"으로 시작합니다) "John Smith"
존재 경로 표현이 하나 이상의 SQL/토토 베이 항목과 일치하는지 테스트 "x": [1, 2], "y": [2, 4] 엄격한 $.*? (존재합니다 (@? (@ [*] 2)) 2, 4
알 수 없음 부울 상태인지 테스트알 수없는 [-1, 2, 7, "Infinity"] $ [*]? ((@ 0) 알 수 없음) "Infinity"