이 섹션에서는 다음을 설명합니다.
토토 베이 데이터 처리 및 생성을 위한 함수 및 연산자
SQL/토토 베이 경로 언어
SQL/토토 베이 표준에 대해 자세히 알아보려면 참조[sqltr-19075-6]. 지원되는 JSON 유형에 대한 자세한 내용은포스트그레SQL, 참조섹션 8.14.
표 9.44토토 베이 데이터 유형과 함께 사용할 수 있는 연산자를 표시합니다(참조섹션 8.14).
표 9.44. 토토 베이그리고토토 베이b연산자
| 운영자 | 오른쪽 피연산자 유형 | 반환 유형 | 설명 | 예 | 예시 결과 |
|---|---|---|---|---|---|
- |
int |
토토 베이또는토토 베이b |
토토 베이 배열 요소 가져오기(0부터 색인화됨, 음의 정수는 끝부터 계산됨) | '["a":"foo","b":"bar","c":"baz"]'::토토 베이-2 |
"c":"baz" |
- |
텍스트 |
토토 베이또는토토 베이b |
키로 토토 베이 객체 필드 가져오기 | '"a": "b":"foo"'::토토 베이-'a' |
"b":"foo" |
- |
int |
텍스트 |
JSON 배열 요소를 다음으로 가져오기텍스트 |
'[1,2,3]'::토토 베이-2 |
3 |
- |
텍스트 |
텍스트 |
JSON 개체 필드를 다음으로 가져오기텍스트 |
'"a":1,"b":2'::토토 베이-'b' |
2 |
# |
텍스트[] |
토토 베이또는토토 베이b |
지정된 경로에서 토토 베이 객체 가져오기 | '"a": "b":"c": "foo"'::토토 베이#'a,b' |
"c": "foo" |
# |
텍스트[] |
텍스트 |
지정된 경로에서 JSON 객체를 다음과 같이 가져옵니다.텍스트 |
'"a":[1,2,3],"b":[4,5,6]'::토토 베이#'a,2' |
3 |
두 가지 모두에 대해 이러한 연산자의 병렬 변형이 있습니다.토토 베이그리고토토 베이b유형. 필드/요소/경로 추출 연산자는 왼쪽 입력과 동일한 유형을 반환합니다(둘 중 하나)토토 베이또는토토 베이b), 반환으로 지정된 항목 제외텍스트, 값을 텍스트로 강제 변환합니다. 필드/요소/경로 추출 연산자는 JSON 입력에 요청과 일치하는 올바른 구조가 없는 경우 실패하지 않고 NULL을 반환합니다. 예를 들어 그러한 요소가 존재하지 않는 경우. 정수 JSON 배열 첨자를 허용하는 필드/요소/경로 추출 연산자는 모두 배열 끝에서 음수 첨자를 지원합니다.
다음에 표시된 표준 비교 연산자표 9.1사용 가능토토 베이b, 하지만 다음의 경우는 아님토토 베이. 이는 다음에 설명된 B-트리 작업의 순서 규칙을 따릅니다.섹션 8.14.4. 또한 참조하세요PostgreSQL : 문서 : 12 : 9.20. 윈 토토 기능집계 함수용토토 베이_agg레코드 값을 집계 함수인 토토 베이으로 집계합니다.토토 베이_object_agg값 쌍을 토토 베이 객체로 집계하고 해당토토 베이b등가물,토토 베이b_agg그리고토토 베이b_object_agg.
일부 추가 연산자도 다음 용도로만 존재합니다.토토 베이b, 다음과 같이표 9.45. 이러한 연산자 중 다수는 다음을 통해 색인을 생성할 수 있습니다.토토 베이b연산자 클래스. 전체 설명을 보려면토토 베이b격납 및 존재 의미, 참조섹션 8.14.3. 섹션 8.14.4이러한 연산자를 사용하여 효과적으로 색인을 생성하는 방법을 설명합니다.토토 베이b데이터.
표 9.45. 추가의토토 베이b연산자
| 운영자 | 오른쪽 피연산자 유형 | 설명 | 예 |
|---|---|---|---|
@ |
토토 베이b |
왼쪽 토토 베이 값에는 최상위 수준의 올바른 토토 베이 경로/값 항목이 포함되어 있습니까? | '"a":1, "b":2'::토토 베이b @ '"b":2'::토토 베이b |
<@ |
토토 베이b |
왼쪽 토토 베이 경로/값 항목이 오른쪽 토토 베이 값 내 최상위 수준에 포함되어 있습니까? | '"b":2'::토토 베이b <@ '"a":1, "b":2'::토토 베이b |
? |
텍스트 |
다음을 수행합니다문자열토토 베이 값 내에 최상위 키로 존재합니까? | '"a":1, "b":2'::토토 베이b ? '비' |
?| |
텍스트[] |
다음 배열 중 하나를 수행문자열최상위 키로 존재합니까? | '"a":1, "b":2, "c":3'::토토 베이b ?| 배열['b', 'c'] |
?& |
텍스트[] |
이 배열을 모두 수행문자열최상위 키로 존재합니까? | '["a", "b"]'::토토 베이b ?& 배열['a', 'b'] |
|| |
토토 베이b |
두 개 연결토토 베이b값을 새 값으로토토 베이b값 |
'["a", "b"]'::토토 베이b || '["c", "d"]'::토토 베이b |
- |
텍스트 |
키/값 쌍 삭제 또는문자열왼쪽 피연산자의 요소입니다. 키-값 쌍은 키 값을 기준으로 일치됩니다. | '"a": "b"'::토토 베이b - 'a' |
- |
텍스트[] |
여러 개의 키/값 쌍을 삭제하거나문자열왼쪽 피연산자의 요소. 키-값 쌍은 키 값을 기준으로 일치됩니다. | '"a": "b", "c": "d"'::토토 베이b - 'a,c'::text[] |
- |
정수 |
지정된 인덱스를 가진 배열 요소를 삭제합니다(음의 정수는 끝부터 계산됩니다). 최상위 컨테이너가 배열이 아닌 경우 오류가 발생합니다. | '["a", "b"]'::토토 베이b - 1 |
#- |
텍스트[] |
지정된 경로가 있는 필드 또는 요소 삭제(JSON 배열의 경우 음수는 끝부터 계산됩니다.) | '["a", "b":1]'::토토 베이b #- '1,b' |
@? |
토토 베이path |
토토 베이 경로는 지정된 토토 베이 값에 대한 항목을 반환합니까? | '"a":[1,2,3,4,5]'::토토 베이b @? '$.a[*] ? (@ 2)' |
@@ |
토토 베이path |
지정된 토토 베이 값에 대한 토토 베이 경로 조건자 확인 결과를 반환합니다. 결과의 첫 번째 항목만 고려됩니다. 결과가 부울이 아니면널반환되었습니다. |
'"a":[1,2,3,4,5]'::토토 베이b @@ '$.a[*] 2' |
그||연산자는 키의 합집합을 포함하는 객체를 생성하여 두 개의 JSON 객체를 연결하고, 중복 키가 있는 경우 두 번째 객체의 값을 가져옵니다. 다른 모든 경우는 JSON 배열을 생성합니다. 먼저 배열이 아닌 모든 입력이 단일 요소 배열로 변환된 다음 두 배열이 연결됩니다. 재귀적으로 작동하지 않습니다. 최상위 배열 또는 객체 구조만 병합됩니다.
그@?그리고@@연산자는 객체 필드 또는 배열 요소 부족, 예상치 못한 JSON 항목 유형 및 숫자 오류와 같은 오류를 억제합니다. 이 동작은 다양한 구조의 JSON 문서 컬렉션을 검색하는 동안 도움이 될 수 있습니다.
표 9.46생성에 사용할 수 있는 함수를 표시합니다.토토 베이그리고토토 베이b값. (동등한 기능이 없습니다.토토 베이b, of therow_to_토토 베이그리고array_to_토토 베이함수. 그러나,to_토토 베이b함수는 이러한 함수와 거의 동일한 기능을 제공합니다.)
표 9.46. JSON 생성 함수
| 기능 | 설명 | 예 | 예시 결과 |
|---|---|---|---|
|
|
값을 다음과 같이 반환합니다.토토 베이또는토토 베이b. 배열과 복합물은 (재귀적으로) 배열과 객체로 변환됩니다. 그렇지 않은 경우 유형에서 다음으로 캐스트가 있는 경우토토 베이, 변환을 수행하는 데 캐스트 함수가 사용됩니다. 그렇지 않으면 스칼라 값이 생성됩니다. 숫자, 부울 또는 null 값이 아닌 스칼라 유형의 경우 유효한 방식으로 텍스트 표현이 사용됩니다.토토 베이또는토토 베이b값. |
to_토토 베이('프레드가 "안녕하세요."라고 말했습니다.'::text) |
"프레드가 \"안녕\"이라고 말했습니다." |
array_to_토토 베이(anyarray [, Pretty_bool]) |
배열을 JSON 배열로 반환합니다. PostgreSQL 다차원 배열은 배열의 JSON 배열이 됩니다. 다음과 같은 경우 차원-1 요소 사이에 줄 바꿈이 추가됩니다.pretty_bool사실입니다. |
array_to_토토 베이('1,5,99,100'::int[]) |
[[1,5],[99,100]] |
row_to_토토 베이(기록 [, beautiful_bool]) |
행을 JSON 개체로 반환합니다. 다음과 같은 경우 레벨 1 요소 사이에 줄바꿈이 추가됩니다.pretty_bool사실입니다. |
row_to_토토 베이(row(1,'foo')) |
"f1":1,"f2":"foo" |
|
|
가변 인수 목록에서 이종 유형의 토토 베이 배열을 구축합니다. | 토토 베이_build_array(1,2,'3',4,5) |
[1, 2, "3", 4, 5] |
|
|
가변 인수 목록에서 토토 베이 개체를 만듭니다. 관례적으로 인수 목록은 교대로 키와 값으로 구성됩니다. | 토토 베이_build_object('foo',1,'bar',2) |
"foo": 1, "bar": 2 |
|
|
텍스트 배열에서 JSON 개체를 만듭니다. 배열에는 짝수의 멤버가 포함된 정확히 1차원(이 경우 대체 키/값 쌍으로 간주됨)이 있거나, 각 내부 배열에 정확히 2개의 요소가 포함되어 키/값 쌍으로 간주되는 2차원이 있어야 합니다. |
|
"a": "1", "b": "def", "c": "3.5" |
|
|
이 형태는토토 베이_object두 개의 개별 배열에서 키와 값을 쌍으로 가져옵니다. 다른 모든 측면에서는 단일 인수 형식과 동일합니다. |
토토 베이_object('a, b', '1,2') |
"a": "1", "b": "2" |
array_to_토토 베이그리고row_to_토토 베이다음과 동일한 동작을 가짐to_토토 베이예쁜 인쇄 옵션을 제공하는 것은 제외됩니다. 설명된 동작은to_토토 베이마찬가지로 다른 토토 베이 생성 함수에 의해 변환된 각 개별 값에도 적용됩니다.
그PostgreSQL : 문서 : 12 : F.16. 와이즈 토토확장 프로그램이 다음에서 캐스트되었습니다.hstore에토토 베이그러니까hstoreJSON 생성 함수를 통해 변환된 값은 기본 문자열 값이 아닌 JSON 개체로 표시됩니다.
표 9.47처리에 사용할 수 있는 기능을 표시토토 베이그리고토토 베이b값.
표 9.47. JSON 처리 함수
| 기능 | 반환 유형 | 설명 | 예 | 예시 결과 |
|---|---|---|---|---|
|
|
int |
가장 바깥쪽 토토 베이 배열의 요소 수를 반환합니다. | 토토 베이_array_length('[1,2,3,"f1":1,"f2":[5,6],4]') |
5 |
|
|
|
가장 바깥쪽 토토 베이 개체를 키/값 쌍 세트로 확장합니다. | 토토 베이_each('"a":"foo", "b":"bar"')에서 * 선택 |
키 | 값 ------+------- | "푸" 비 | "술집" |
|
|
키 텍스트 집합, 값 텍스트 |
가장 바깥쪽 토토 베이 개체를 키/값 쌍 세트로 확장합니다. 반환된 값은 다음과 같습니다.텍스트. |
토토 베이_each_text('"a":"foo", "b":"bar"')에서 * 선택 |
키 | 값 ------+------- | 푸 비 | 술집 |
|
|
|
다음이 가리키는 JSON 값을 반환합니다.path_elems(동등함#연산자). |
토토 베이_extract_path('"f2":"f3":1,"f4":"f5":99,"f6":"foo"','f4') |
"f5":99,"f6":"foo" |
|
|
텍스트 |
다음이 가리키는 JSON 값을 반환합니다.path_elemsas텍스트(동등함#연산자). |
토토 베이_extract_path_text('"f2":"f3":1,"f4":"f5":99,"f6":"foo"','f4', 'f6') |
foo |
|
|
텍스트 집합 |
가장 바깥쪽 토토 베이 객체의 키 세트를 반환합니다. | 토토 베이_object_keys('"f1":"abc","f2":"f3":"a", "f4":"b"') |
토토 베이_object_keys ------------------ f1 f2 |
|
|
모든 요소 |
객체를 확장합니다from_토토 베이열이 정의된 레코드 유형과 일치하는 행에베이스(아래 참고 참조). |
select * from 토토 베이_populate_record(null::myrowtype, '"a": 1, "b": ["2", "a b"], "c": "d": 4, "e": "a b c"') |
a | 비 | 기음 ---+------------+------------- 1 | 2,"a b" | (4,"a b c") |
|
|
모든 요소의 집합 |
객체의 가장 바깥쪽 배열을 확장합니다.from_토토 베이열이 정의된 레코드 유형과 일치하는 행 집합으로기본(아래 참고 참조). |
토토 베이_populate_recordset(null::myrowtype, '["a":1,"b":2,"a":3,"b":4]')에서 * 선택 |
a | 비 ---+--- 1 | 2 3 | 4 |
|
|
|
토토 베이 배열을 토토 베이 값 세트로 확장합니다. | 토토 베이_array_elements('[1,true, [2,false]]')에서 * 선택 |
값 ----------- 1 진실 [2,거짓] |
|
|
텍스트 집합 |
JSON 배열을 다음 집합으로 확장합니다.텍스트값. |
토토 베이_array_elements_text('["foo", "bar"]')에서 * 선택 |
값 ----------- 푸 술집 |
|
|
텍스트 |
가장 바깥쪽 JSON 값의 유형을 텍스트 문자열로 반환합니다. 가능한 유형은 다음과 같습니다.객체, 배열, 문자열, 번호, 부울및널. |
토토 베이_typeof('-123.4') |
번호 |
|
|
기록 |
JSON 개체에서 임의의 레코드를 작성합니다(아래 참고 참조). 반환되는 모든 함수와 마찬가지로기록, 호출자는를 사용하여 레코드의 구조를 명시적으로 정의해야 합니다.AS절. |
select * from 토토 베이_to_record('"a":1,"b":[1,2,3],"c":[1,2,3],"e":"bar","r": "a": 123, "b": "a b c"') as x(a int, b text, c int[], d text, r 마이로우타입) |
a | 비 | c | 디 | 아르 자형 ---+---------+---------+---+--------------- 1 | [1,2,3] | 1,2,3 | | (123,"abc") |
|
|
레코드 집합 |
JSON 개체 배열에서 임의의 레코드 세트를 작성합니다(아래 참고 참조). 반환되는 모든 함수와 마찬가지로기록, 호출자는를 사용하여 레코드의 구조를 명시적으로 정의해야 합니다.AS절. |
select * from 토토 베이_to_recordset('["a":1,"b":"foo","a":"2","c":"bar"]')를 x(a int, b text)로 선택; |
a | 비 ---+----- 1 | 푸 2 | |
|
|
|
반품from_토토 베이Null 값이 있는 모든 개체 필드는 생략됩니다. 다른 null 값은 그대로 유지됩니다. |
토토 베이_strip_nulls('["f1":1,"f2":null,2,null,3]') |
["f1":1,2,null,3] |
|
|
|
반품대상다음으로 지정된 섹션 포함경로다음으로 대체됨new_value또는new_value만약에 추가됨create_missing참입니다(기본값은참) 및 다음으로 지정된 항목경로존재하지 않습니다. 경로 지향 연산자와 마찬가지로, 다음에 나타나는 음의 정수는경로JSON 배열의 끝부터 계산합니다. |
|
|
|
|
|
반환대상와new_value삽입되었습니다. 만약에대상다음으로 지정된 섹션경로JSONB 배열에 있습니다.new_value대상 앞이나 뒤에 삽입됩니다.insert_after참입니다(기본값은거짓). 만약에대상다음으로 지정된 섹션경로토토 베이B 개체에 있습니다.new_value다음의 경우에만 삽입됩니다대상존재하지 않습니다. 경로 지향 연산자와 마찬가지로, 다음에 나타나는 음의 정수는경로JSON 배열의 끝부터 계산합니다. |
|
|
|
|
|
반품from_토토 베이들여쓰기된 JSON 텍스트로. |
토토 베이b_pretty('["f1":1,"f2":null,2,null,3]') |
[
"f1": 1,
"f2": null
,
2,
널,
3
]
|
|
|
부울 |
JSON 경로가 지정된 JSON 값에 대한 항목을 반환하는지 확인합니다. |
|
|
|
|
부울 |
지정된 토토 베이 값에 대한 토토 베이 경로 조건자 확인 결과를 반환합니다. 결과의 첫 번째 항목만 고려됩니다. 결과가 부울이 아니면널반환되었습니다. |
|
|
|
|
토토 베이b 집합 |
지정된 JSON 값에 대해 JSON 경로에서 반환된 모든 JSON 항목을 가져옵니다. |
|
토토 베이b_path_query ------------------ 2 3 4 |
|
|
토토 베이b |
지정된 JSON 값에 대해 JSON 경로에서 반환된 모든 JSON 항목을 가져오고 결과를 배열로 래핑합니다. |
|
|
|
|
토토 베이b |
지정된 JSON 값에 대해 JSON 경로에서 반환된 첫 번째 JSON 항목을 가져옵니다. 보고NULL결과가 없습니다. |
|
|
이러한 함수 및 연산자 중 다수는 JSON 문자열의 유니코드 이스케이프를 적절한 단일 문자로 변환합니다. 입력이 유형인 경우에는 문제가 되지 않습니다.토토 베이b, 변환이 이미 완료되었기 때문입니다. 하지만토토 베이입력하면 다음에 언급된 대로 오류가 발생할 수 있습니다.섹션 8.14.
함수토토 베이[b]_populate_record, 토토 베이[b]_populate_recordset, 토토 베이[b]_to_record그리고토토 베이[b]_to_recordsetJSON 개체 또는 개체 배열에 대해 작업을 수행하고 이름이 출력 행 유형의 열 이름과 일치하는 키와 연결된 값을 추출합니다. 출력 열 이름과 일치하지 않는 개체 필드는 무시되고, 개체 필드와 일치하지 않는 출력 열은 Null로 채워집니다. JSON 값을 출력 열의 SQL 유형으로 변환하려면 다음 규칙이 순서대로 적용됩니다.
토토 베이 null 값은 모든 경우에 SQL null로 변환됩니다.
출력 열이 유형인 경우토토 베이또는토토 베이b, 토토 베이 값이 정확하게 재현되었습니다.
출력 열이 복합(행) 유형이고 JSON 값이 JSON 객체인 경우, 객체의 필드는 이러한 규칙의 재귀적 적용에 의해 출력 행 유형의 열로 변환됩니다.
마찬가지로, 출력 열이 배열 유형이고 JSON 값이 JSON 배열인 경우 JSON 배열의 요소는 이러한 규칙을 재귀적으로 적용하여 출력 배열의 요소로 변환됩니다.
그렇지 않으면 JSON 값이 문자열 리터럴인 경우 문자열의 내용은 열의 데이터 유형에 대한 입력 변환 함수에 제공됩니다.
그렇지 않으면 JSON 값의 일반 텍스트 표현이 열의 데이터 유형에 대한 입력 변환 함수에 제공됩니다.
이러한 함수의 예에서는 상수를 사용하지만 일반적인 용도는 다음에서 테이블을 참조하는 것입니다.발신절 중 하나를 사용하여토토 베이또는토토 베이b열을 함수에 대한 인수로 사용합니다. 추출된 키 값은 다음과 같은 쿼리의 다른 부분에서 참조될 수 있습니다.어디에서절 및 대상 목록. 이러한 방식으로 여러 값을 추출하면 키별 연산자를 사용하여 개별적으로 추출하는 것보다 성능이 향상될 수 있습니다.
모든 항목경로매개변수토토 베이b_set또한토토 베이b_insert단, 마지막 항목은 다음에 있어야 합니다.대상. 만약에create_missing거짓입니다. 모든 항목은경로매개변수토토 베이b_set반드시 존재해야 합니다. 이러한 조건이 충족되지 않으면대상변경되지 않은 상태로 반환됩니다.
마지막 경로 항목이 개체 키인 경우, 개체 키가 없으면 새 값이 주어지면 생성됩니다. 마지막 경로 항목이 배열 인덱스인 경우 양수이면 설정할 항목을 왼쪽부터 세기, 음수이면 오른쪽부터 세기 --1가장 오른쪽 요소를 지정합니다. 항목이 -array_length .. array_length -1 범위를 벗어나고 create_missing이 true인 경우 항목이 음수이면 배열의 시작 부분에 새 값이 추가되고 양수이면 배열의 끝에 추가됩니다.
그토토 베이_typeof함수널반환 값을 SQL NULL과 혼동해서는 안 됩니다. 통화 중토토 베이_typeof('null'::토토 베이)반환할 것입니다널, 전화 중토토 베이_typeof(NULL::토토 베이)SQL NULL을 반환합니다.
인수가토토 베이_strip_nulls객체에 중복된 필드 이름이 포함되어 있으면 결과는 발생 순서에 따라 의미상 다소 다를 수 있습니다. 이것은 문제가 되지 않습니다.토토 베이b_strip_nulls이후토토 베이b값에는 중복된 개체 필드 이름이 없습니다.
그토토 베이b_path_exists, 토토 베이b_path_match, 토토 베이b_path_query, 토토 베이b_path_query_array및토토 베이b_path_query_first함수에는 선택사항이 있습니다.vars그리고침묵인수.
만약에vars인수가 지정되면 a로 대체될 명명된 변수가 포함된 개체를 제공합니다.토토 베이path표현.
만약에침묵인수가 지정되었으며 다음을 가집니다.참값, 이 함수는 다음과 같은 오류를 억제합니다.@?그리고@@연산자.
SQL/JSON 경로 표현식은 XML에 대한 SQL 액세스에 사용되는 XPath 표현식과 유사하게 JSON 데이터에서 검색할 항목을 지정합니다. 안에PostgreSQL, 경로 표현식은 다음과 같이 구현됩니다.토토 베이path데이터 유형이며 다음에 설명된 모든 요소를 사용할 수 있습니다.섹션 8.14.6.
JSON 쿼리 함수 및 연산자는 제공된 경로 표현식을 다음으로 전달합니다.경로 엔진평가용. 표현식이 쿼리된 JSON 데이터와 일치하면 해당 SQL/JSON 항목이 반환됩니다. 경로 표현식은 SQL/토토 베이 경로 언어로 작성되며 산술 표현식과 함수를 포함할 수도 있습니다. 쿼리 함수는 제공된 표현식을 텍스트 문자열로 처리하므로 작은따옴표로 묶어야 합니다.
경로 표현식은 다음에서 허용하는 일련의 요소로 구성됩니다.토토 베이path데이터 유형. 경로 표현식은 왼쪽에서 오른쪽으로 평가되지만 괄호를 사용하여 작업 순서를 변경할 수 있습니다. 평가가 성공하면 일련의 SQL/JSON 항목(SQL/토토 베이 시퀀스)이 생성되고 평가 결과는 지정된 계산을 완료하는 JSON 쿼리 함수로 반환됩니다.
쿼리할 토토 베이 데이터를 참조하려면(컨텍스트 항목), 다음을 사용하세요.$경로 표현식에 서명하세요. 다음에는 하나 이상이 올 수 있습니다.접속자 연산자은 JSON 구조를 레벨별로 내려와 컨텍스트 항목의 콘텐츠를 검색합니다. 뒤따르는 각 연산자는 이전 평가 단계의 결과를 처리합니다.
예를 들어, 분석하려는 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
]
사용 가능한 트랙 세그먼트를 검색하려면 다음을 사용해야 합니다..이전의 모든 JSON 객체에 대한 접근자 연산자:키
'$.track.segments'
검색할 항목이 배열의 요소인 경우 다음을 사용하여 이 배열의 중첩을 해제해야 합니다.[*]연산자. 예를 들어 다음 경로는 사용 가능한 모든 트랙 세그먼트에 대한 위치 좌표를 반환합니다.
'$.track.segments[*].location'
첫 번째 세그먼트의 좌표만 반환하려면 다음에서 해당 첨자를 지정할 수 있습니다.[]접속자 연산자. SQL/JSON 배열은 0을 기준으로 합니다.
'$.track.segments[0].location'
각 경로 평가 단계의 결과는 하나 이상에서 처리될 수 있습니다.토토 베이path다음에 나열된 연산자 및 메소드섹션 9.15.2.3. 각 메소드 이름 앞에는 점이 와야 합니다. 예를 들어 배열 크기를 얻을 수 있습니다.
'$.track.segments.size()'
사용에 대한 더 많은 예를 보려면토토 베이path경로 표현식 내의 연산자 및 메소드, 참조섹션 9.15.2.3.
경로를 정의할 때 하나 이상의 경로를 사용할 수도 있습니다.필터 표현식이것은 다음과 유사하게 작동합니다어디62813_62919
? (조건)
필터 표현식은 적용되는 경로 평가 단계 직후에 지정되어야 합니다. 이 단계의 결과는 제공된 조건을 만족하는 항목만 포함하도록 필터링됩니다. SQL/JSON은 3개의 값을 갖는 논리를 정의하므로 조건은 다음과 같습니다.참, 거짓또는알 수 없음. 그만큼알 수 없음값은 SQL과 동일한 역할을 합니다.NULL다음으로 테스트할 수 있습니다.알 수 없음술어. 추가 경로 평가 단계에서는 필터 표현식이 반환되는 항목만 사용합니다.참.
필터 표현식에 사용할 수 있는 함수 및 연산자는 다음에 나열되어 있습니다.표 9.49. 필터링할 경로 평가 결과는 다음과 같이 표시됩니다.@변수. 더 낮은 중첩 수준에 저장된 JSON 요소를 참조하려면 뒤에 하나 이상의 접근자 연산자를 추가하세요.@.
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)'
또한 필터 표현식을 서로 중첩할 수 있습니다:
'$.track ? (존재(@.segments[*] ? (@.HR 130))).segments.size()'
이 표현식은 심박수 값이 높은 세그먼트가 포함된 경우 트랙의 크기를 반환하고 그렇지 않은 경우 빈 시퀀스를 반환합니다.
포스트그레SQL의 SQL/토토 베이 경로 언어 구현에는 SQL/JSON 표준과 다음과 같은 차이가 있습니다.
.datetime()항목 메소드는 주로 불변이기 때문에 아직 구현되지 않았습니다.토토 베이path함수 및 연산자는 일부 날짜/시간 작업에 사용되는 세션 시간대를 참조할 수 없습니다. 날짜/시간 지원이 추가됩니다.토토 베이path향후 버전에서포스트그레SQL.
SQL/JSON 표준은 필터에서만 조건자를 허용하지만 경로 표현식은 부울 조건자가 될 수 있습니다. 이는 다음을 구현하는 데 필요합니다.@@연산자. 예를 들어 다음과 같습니다.토토 베이path표현식은 다음에서 유효합니다.포스트그레SQL:
'$.track.segments[*].HR < 70'
다음에 사용된 정규식 패턴의 해석에는 약간의 차이가 있습니다.like_regex에 설명된 필터섹션 9.15.2.2.
JSON 데이터를 쿼리할 때 경로 표현식이 실제 JSON 데이터 구조와 일치하지 않을 수 있습니다. 존재하지 않는 개체 멤버나 배열 요소에 액세스하려고 하면 구조적 오류가 발생합니다. SQL/JSON 경로 표현식에는 구조적 오류를 처리하는 두 가지 모드가 있습니다.
lax(기본값) — 경로 엔진은 쿼리된 데이터를 지정된 경로에 암시적으로 적용합니다. 나머지 구조적 오류는 모두 억제되고 빈 SQL/토토 베이 시퀀스로 변환됩니다.
strict — 구조적 오류가 발생하면 오류가 발생합니다.
lax 모드는 JSON 데이터가 예상 스키마와 일치하지 않는 경우 JSON 문서 구조와 경로 표현의 일치를 용이하게 합니다. 피연산자가 특정 작업의 요구 사항과 일치하지 않는 경우 이 작업을 수행하기 전에 해당 요소를 SQL/토토 베이 시퀀스로 변환하여 자동으로 SQL/JSON 배열로 래핑되거나 래핑 해제될 수 있습니다. 게다가 비교 연산자는 lax 모드에서 피연산자를 자동으로 풀기 때문에 SQL/JSON 배열을 즉시 비교할 수 있습니다. 크기가 1인 배열은 해당 배열의 유일한 요소와 동일한 것으로 간주됩니다. 자동 언래핑은 다음과 같은 경우에만 수행되지 않습니다.
경로 표현식에는 다음이 포함됩니다.유형()또는크기()배열에 있는 요소의 유형과 개수를 각각 반환하는 메서드.
조회된 JSON 데이터에 중첩 배열이 포함되어 있습니다. 이 경우 가장 바깥쪽 배열만 래핑 해제되고 모든 내부 배열은 변경되지 않습니다. 따라서 암시적 언래핑은 각 경로 평가 단계 내에서 한 수준 아래로만 내려갈 수 있습니다.
예를 들어 위에 나열된 GPS 데이터를 쿼리할 때 lax 모드를 사용할 때 세그먼트 배열을 저장한다는 사실을 추상화할 수 있습니다.
'느슨한 $.track.segments.location'
엄격 모드에서 SQL/JSON 항목을 반환하려면 지정된 경로가 쿼리된 JSON 문서의 구조와 정확히 일치해야 하므로 이 경로 표현식을 사용하면 오류가 발생합니다. lax 모드에서와 동일한 결과를 얻으려면 명시적으로 포장을 풀어야 합니다.세그먼트배열:
'엄격한 $.track.segments[*].location'
그.**접속자는 lax 모드를 사용할 때 놀라운 결과를 초래할 수 있습니다. 예를 들어 다음 쿼리는 다음을 선택합니다.인사값을 두 번:
느슨한 $.**.HR
이것은 다음 때문에 발생합니다..**접속자는 두 가지 모두를 선택합니다세그먼트배열과 그 각 요소, 반면에.HR접속자는 lax 모드를 사용할 때 자동으로 배열을 펼칩니다. 놀라운 결과를 피하려면 다음을 사용하는 것이 좋습니다..**엄격 모드에서만 접속자. 다음 쿼리는 각각을 선택합니다.인사값은 한 번만:
엄격 $.**.HR
SQL/JSON 경로 표현식을 사용하면 텍스트를 다음과 같은 정규 표현식과 일치시킬 수 있습니다.like_regex필터. 예를 들어 다음 SQL/JSON 경로 쿼리는 영어 모음으로 시작하는 배열의 모든 문자열과 대소문자를 구분하지 않고 일치합니다.
'$[*] ? (@ like_regex "^[aeiou]" 플래그 "i")'
선택사항플래그문자열에는 하나 이상의 문자가 포함될 수 있습니다.i대소문자를 구분하지 않는 일치의 경우,m허용하다^그리고$줄바꿈에서 일치시키려면,s허용하다.개행 문자와 일치하고q전체 패턴을 인용합니다(동작을 간단한 하위 문자열 일치로 축소).
SQL/JSON 표준은 다음에서 정규 표현식에 대한 정의를 차용합니다.LIKE_REGEX연산자이며 이는 XQuery 표준을 사용합니다. PostgreSQL은 현재 다음을 지원하지 않습니다.LIKE_REGEX연산자. 그러므로,like_regex필터는 다음에 설명된 POSIX 정규식 엔진을 사용하여 구현됩니다.섹션 9.7.3. 이로 인해 표준 SQL/JSON 동작과 여러 가지 사소한 불일치가 발생합니다. 이에 대한 목록은 다음과 같습니다.섹션 9.7.3.8. 그러나 여기에 설명된 플래그 문자 비호환성은 SQL/JSON에 적용되지 않습니다. SQL/JSON은 POSIX 엔진이 예상하는 것과 일치하도록 XQuery 플래그 문자를 변환하기 때문입니다.
다음의 패턴 인수를 명심하십시오.like_regex은(는) 다음에 제공된 규칙에 따라 작성된 JSON 경로 문자열 리터럴입니다.섹션 8.14.6. 이는 특히 정규 표현식에 사용하려는 백슬래시를 두 배로 늘려야 함을 의미합니다. 예를 들어, 숫자만 포함하는 루트 문서의 문자열 값을 일치시키려면 다음을 수행하십시오.
$.* ? (@ like_regex "^\\d+$")
표 9.48다음에서 사용할 수 있는 연산자와 메소드를 표시합니다.토토 베이path. 표 9.49사용 가능한 필터 표현식 요소를 표시합니다.
표 9.48. 토토 베이path연산자 및 방법
| 연산자/메소드 | 설명 | 예제 토토 베이 | 예시 쿼리 | 결과 |
|---|---|---|---|---|
+(단항) |
SQL/토토 베이 시퀀스를 반복하는 플러스 연산자 | "x": [2.85, -14.7, -9.4] |
+ $.x.floor() |
2, -15, -10 |
-(단항) |
SQL/토토 베이 시퀀스를 반복하는 빼기 연산자 | "x": [2.85, -14.7, -9.4] |
- $.x.floor() |
-2, 15, 10 |
+(바이너리) |
추가 | [2] |
2 + $[0] |
4 |
-(바이너리) |
뺄셈 | [2] |
4 - $[0] |
2 |
* |
곱셈 | [4] |
2 * $[0] |
8 |
/ |
부서 | [8] |
$[0] / 2 |
4 |
% |
모듈러스 | [32] |
$[0] % 10 |
2 |
유형() |
SQL/토토 베이 항목 유형 | [1, "2", {}] |
$[*].type() |
"숫자", "문자열", "객체" |
크기() |
SQL/토토 베이 항목의 크기 | "m": [11, 15] |
$.m.size() |
2 |
더블() |
SQL/JSON 숫자 또는 문자열에서 변환된 대략적인 부동 소수점 숫자 | "len": "1.9" |
$.len.double() * 2 |
3.8 |
천장() |
SQL/JSON 숫자보다 크거나 같은 가장 가까운 정수 | "h": 1.3 |
$.h.ceiling() |
2 |
바닥() |
SQL/JSON 숫자보다 작거나 같은 가장 가까운 정수 | "h": 1.3 |
$.h.floor() |
1 |
절대() |
SQL/JSON 번호의 절대값 | "z": -0.3 |
$.z.abs() |
0.3 |
키값() |
세 개의 필드를 포함하는 항목 배열로 표현되는 객체의 키-값 쌍 순서 ("열쇠", "값"및"ID"). "ID"은(는) 개체 키-값 쌍이 속한 개체의 고유 식별자입니다. |
"x": "20", "y": 32 |
$.keyvalue() |
"키": "x", "값": "20", "id": 0, "키": "y", "값": 32, "id": 0 |
표 9.49. 토토 베이path필터 표현식 요소
| 값/술어 | 설명 | 예제 토토 베이 | 예시 쿼리 | 결과 |
|---|---|---|---|---|
== |
동등 연산자 | [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 |
참 |
토토 베이과 비교를 수행하는 데 사용되는 값참리터럴 |
["name": "John", "parent": false, "name": "Chris", "parent": true] |
$[*] ? (@.parent == 참) |
"이름": "크리스", "부모": 참 |
거짓 |
토토 베이과 비교를 수행하는 데 사용되는 값거짓리터럴 |
["name": "John", "parent": false, "name": "Chris", "parent": true] |
$[*] ? (@.parent == 거짓) |
"이름": "존", "부모": 거짓 |
널 |
토토 베이과 비교를 수행하는 데 사용되는 값널값 |
["name": "Mary", "job": null, "name": "Michael", "job": "driver"] |
$[*] ? (@.job == null) .name |
"메리" |
&& |
부울 AND | [1, 3, 7] |
$[*] ? (@ 1 && @ < 5) |
3 |
|| |
부울 OR | [1, 3, 7] |
$[*] ? (@ < 1 || @ 5) |
7 |
! |
부울 NOT | [1, 3, 7] |
$[*] ? (!(@ < 5)) |
7 |
like_regex |
첫 번째 피연산자가 두 번째 피연산자가 제공한 정규식과 일치하는지 여부를 테스트합니다. 선택적으로 다음 문자열로 설명된 수정 사항을 적용합니다.플래그문자(참조섹션 9.15.2.2) |
["abc", "abd", "aBdC", "abdacb", "babc"] |
$[*] ? (@ like_regex "^ab.*c" 플래그 "i") |
"abc", "aBdC", "abdacb" |
다음으로 시작 |
두 번째 피연산자가 첫 번째 피연산자의 초기 부분 문자열인지 테스트합니다. | ["존 스미스", "메리 스톤", "밥 존슨"] |
$[*] ? (@는 "John"으로 시작함) |
"존 스미스" |
존재합니다 |
경로 표현식이 하나 이상의 SQL/JSON 항목과 일치하는지 테스트합니다. | "x": [1, 2], "y": [2, 4] |
엄격한 $.* ? (존재함(@ ? (@[*] 2))) |
2, 4 |
알 수 없음 |
부울 조건이 다음과 같은지 테스트합니다.알 수 없음 |
[-1, 2, 7, "무한대"] |
$[*] ? ((@ 0) 알 수 없음) |
"무한대" |