지원되는 버전:현재 (18) / 17 / 16 / 15 / 14 / 13
개발 버전:개발
지원되지 않는 버전:12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3
이 문서는 지원되지 않는 PostgreSQL 버전에 대한 것입니다.
당신은 다음과 같은 페이지를 보고 싶을 수도 있습니다.현재버전 또는 위에 나열된 다른 지원 버전 중 하나를 사용하세요.

F.16. 젠 토토

이 모듈은 다음을 구현합니다.h스토어데이터 단일 내에 키/값 쌍 세트를 저장하기 위한 유형포스트그레SQL값. 이것은 많은 속성이 있는 행과 같은 다양한 시나리오에서 유용합니다. 거의 검사되지 않거나 반구조화된 데이터입니다. 키와 값은 다음과 같습니다. 단순히 텍스트 문자열입니다.

F.16.1.젠 토토외부 대표

의 텍스트 표현젠 토토, 사용됨 입력 및 출력의 경우 0개 이상을 포함합니다. = 쌍은 쉼표로 구분됩니다. 일부 예:

k = v
foo = 바, baz = 뭐든지
"1-a" = "아무거나"

쌍의 순서는 중요하지 않습니다. 출력시 재현됨). 쌍 사이 또는 주변의 공백=기호는 무시됩니다. 큰따옴표 키 공백, 쉼표를 포함하는 값=s 또는s. 포함하려면 키나 값에 큰따옴표나 백슬래시가 있으면 백슬래시.

각 키젠 토토고유합니다. 당신이 선언하다젠 토토중복 키만 있음 하나는에 저장됩니다젠 토토그리고 거기에 어떤 것이 유지될지에 대한 보장은 없습니다.

SELECT 'a=1,a=2'::젠 토토;
  젠 토토
----------
 "a"="1"

값(키는 제외)은 SQL일 수 있습니다.NULL. 예를 들면:

키 = NULL

NULL키워드는 대소문자를 구분하지 않습니다. 를 큰따옴표로 묶으세요.NULL그것을 다음과 같이 취급합니다 일반 문자열"NULL".

참고:다음을 명심하십시오.h스토어입력에 사용되는 텍스트 형식이 적용됩니다.이전필요한 인용 또는 탈출. 전달하는 경우h스토어리터럴을 매개변수로 사용하는 경우 추가 처리가 필요하지 않습니다. 하지만 인용된 리터럴 상수로 전달하는 경우에는 작은따옴표 문자 및 (설정에 따라)standard_conforming_strings구성 매개변수) 백슬래시 문자는 올바르게 이스케이프되어야 합니다. 참조섹션 4.1.2.1문자열 상수 처리에 대한 자세한 내용.

출력 시 큰따옴표는 항상 키와 값을 묶습니다. 꼭 필요하지 않은 경우.

F.16.2.h스토어연산자와 함수

다음에서 제공하는 연산자h스토어모듈은 다음에 표시됩니다.테이블 F-8, 함수표 F-9.

표 F-8.젠 토토연산자

운영자 설명 결과
젠 토토 - 텍스트 키 값 가져오기(NULL그렇지 않다면 현재) 'a=x, b=y'::젠 토토 - 'a' x
젠 토토 - 텍스트[] 키 값 가져오기(NULL그렇지 않다면 현재) 'a=x, b=y, c=z'::젠 토토 - 배열['c','a'] "z","x"
젠 토토 || 젠 토토 연결젠 토토s 'a=b, c=d'::젠 토토 || 'c=x, d=q'::젠 토토 "a"="b", "c"="x", "d"="q"
젠 토토 ? 텍스트 그렇습니다h스토어키를 포함하고 있나요? 'a=1'::젠 토토 ? 'a' t
젠 토토 ?& 텍스트[] 그렇습니다젠 토토지정된 모든 항목 포함 열쇠? 'a=1,b=2'::젠 토토 ?& 배열['a','b'] t
젠 토토 ?| 텍스트[] 그렇습니다젠 토토지정된 항목 중 하나 포함 열쇠? 'a=1,b=2'::젠 토토 ?| 배열['b','c'] t
젠 토토 @ 젠 토토 왼쪽 피연산자에 오른쪽이 포함되어 있나요? 'a=b, b=1, c=NULL'::젠 토토 @ 'b=1' t
h스토어 <@ h스토어 왼쪽 피연산자가 오른쪽에 포함되어 있습니까? 'a=c'::젠 토토 <@ 'a=b, b=1, c=NULL' f
h스토어 - 텍스트 왼쪽 피연산자에서 키 삭제 'a=1, b=2, c=3'::젠 토토 - 'b'::텍스트 "a"="1", "c"="3"
젠 토토 - 텍스트[] 왼쪽 피연산자에서 키 삭제 'a=1, b=2, c=3'::젠 토토 - 배열['a','b'] "c"="3"
젠 토토 - 젠 토토 왼쪽 피연산자에서 일치하는 쌍 삭제 'a=1, b=2, c=3'::젠 토토 - 'a=4, b=2'::젠 토토 "a"="1", "c"="3"
기록 #= 젠 토토 필드 교체기록일치 포함 의 값젠 토토 예시 섹션 참조
%% h스토어 변환젠 토토교대 배열에 키와 값 %% 'a=foo, b=bar'::젠 토토 a,foo,b,bar
%# 젠 토토 변환젠 토토2차원으로 키/값 배열 %# 'a=foo, b=bar'::젠 토토 a,foo,b,bar

참고:PostgreSQL 8.2 이전에는 격리 연산자@그리고<@부름받았습니다@그리고~입니다. 이 이름은 여전히 ​​사용 가능합니다. 하지만 더 이상 사용되지 않으며 결국 제거될 예정입니다. 주의할 점은 이전 이름은 이전 규칙과 반대입니다. 핵심 기하학적 데이터 유형!

표 F-9.젠 토토기능

기능 반환 유형 설명 결과
젠 토토(레코드) 젠 토토 구성젠 토토기록에서 또는 행 젠 토토(ROW(1,2)) f1=1,f2=2
젠 토토(텍스트[]) h스토어 구성젠 토토배열에서, 이는 키/값 배열이거나 2차원 배열일 수 있습니다. 젠 토토(ARRAY['a','1','b','2']) || 젠 토토(ARRAY[['c','3'],['d','4']]) a=1, b=2, c=3, d=4
젠 토토(텍스트[], 텍스트[]) 젠 토토 구성젠 토토별도의 키와 값 배열 젠 토토(ARRAY['a','b'], 배열['1','2']) "a"="1","b"="2"
젠 토토(텍스트, 텍스트) 젠 토토 단일 항목 만들기h스토어 젠 토토('a', 'b') "a"="b"
akeys(젠 토토) 텍스트[] 얻기젠 토토의 키를 배열로 akeys('a=1,b=2') a,b
스키(젠 토토) 텍스트 집합 얻기h스토어의 키 세트 스키('a=1,b=2')
a
비
avals(젠 토토) 텍스트[] 얻기젠 토토의 값을 배열로 avals('a=1,b=2') {1,2}
svals(젠 토토) 텍스트 집합 얻기젠 토토의 값 세트 svals('a=1,b=2')
1
2
젠 토토_to_array(젠 토토) 텍스트[] 얻기젠 토토의 키와 값을 배열로 키와 값을 교대로 사용함 젠 토토_to_array('a=1,b=2') a,1,b,2
젠 토토_to_matrix(젠 토토) 텍스트[] 얻기젠 토토의 키와 값은 2차원 배열 젠 토토_to_matrix('a=1,b=2') a,1,b,2
젠 토토_to_json(젠 토토) json 얻기젠 토토으로json 젠 토토_to_json('"a key"=1, b=t, c=널, d=12345, e=012345, f=1.234, g=2.345e+4') "a 키": "1", "b": "t", "c": null, "d": "12345", "e": "012345", "f": "1.234", "g": "2.345e+4"
젠 토토_to_json_loose(젠 토토) json 얻기젠 토토으로json값이지만 숫자와 부울 값이므로 JSON에서 인용되지 않습니다. 젠 토토_to_json_loose('"키"=1, b=t, c=널, d=12345, e=012345, f=1.234, g=2.345e+4') "a 키": 1, "b": 참, "c": null, "d": 12345, "e": "012345", "f": 1.234, "g": 2.345e+4
슬라이스(젠 토토, 텍스트[]) 젠 토토 의 하위 집합 추출h스토어 슬라이스('a=1,b=2,c=3'::젠 토토, ARRAY['b','c','x']) "b"="2", "c"="3"
각(젠 토토) setof(키 텍스트, 값 텍스트) 얻기젠 토토의 키와 값은 설정 다음에서 *를 선택하세요 각각('a=1,b=2')
키 | 가치
------+-------
 | 1
 비 | 2
존재(젠 토토,text) 부울 그렇습니다젠 토토키를 포함하고 있나요? 존재('a=1','a') t
정의됨(젠 토토,text) 부울 합니다젠 토토비- 포함NULL키 값? 정의('a=NULL','a') f
삭제(젠 토토,text) 젠 토토 일치하는 키가 있는 쌍 삭제 삭제('a=1,b=2','b') "a"="1"
삭제(젠 토토,text[]) 젠 토토 일치하는 키가 있는 쌍 삭제 삭제('a=1,b=2,c=3',ARRAY['a','b']) "c"="3"
삭제(젠 토토,젠 토토) 젠 토토 두 번째 인수와 일치하는 쌍을 삭제 삭제('a=1,b=2','a=4,b=2'::젠 토토) "a"="1"
populate_record(레코드,젠 토토) 기록 필드 교체기록일치 포함 의 값젠 토토 예시 섹션 참조

참고:함수젠 토토_to_json다음의 경우에 사용됩니다.h스토어값이 다음으로 변환됨json.

참고:함수populate_record실제로 선언된 내용은모든 요소, 아님기록, 첫 번째 인수로 사용하지만 레코드가 아닌 유형을 거부합니다. 런타임 오류입니다.

F.16.3. 인덱스

h스토어GiST 및 GIN 인덱스 지원 기능이 있습니다.@, ?, ?&그리고?|연산자. 예를 들면:

GIST(h)를 사용하여 test젠 토토에서 hidx 인덱스 생성;

GIN(h)을 사용하여 test젠 토토에서 인덱스 hidx를 생성합니다.

젠 토토또한 지원합니다브트리또는해시에 대한 색인=연산자. 이것은 허용합니다h스토어선언할 열고유또는 다음에 사용됨그룹 으로, 주문 기준또는독특식. 정렬 순서는 다음과 같습니다.젠 토토값은 특별히 유용하지는 않지만, 이러한 색인은 동등성 조회에 유용할 수 있습니다. 색인 생성 에 대한=비교는 다음과 같습니다.

BTREE(h)를 사용하여 test젠 토토에서 hidx 인덱스 생성;

HASH(h)를 사용하여 test젠 토토에서 인덱스 hidx를 생성합니다.

F.16.4. 예

키를 추가하거나 기존 키를 새 값으로 업데이트하세요:

업데이트 탭 SET h = h || 젠 토토('c', '3');

키 삭제:

UPDATE 탭 SET h = 삭제(h, 'k1');

변환 a기록h스토어:

CREATE TABLE 테스트(col1 정수, col2 텍스트, col3 텍스트);
테스트 값에 삽입(123, 'foo', 'bar');

SELECT 젠 토토(t) FROM 테스트 AS t;
                   젠 토토                    
--------------------------------
 "col1"="123", "col2"="foo", "col3"="바"
(1행)

변환젠 토토미리 정의된기록유형:

CREATE TABLE 테스트(col1 정수, col2 텍스트, col3 텍스트);

SELECT * FROM populate_record(null::테스트,
                              '"col1"="456", "col2"="zzz"');
 열1 | 열2 | col3 
------+------+------
  456 | zzz | 
(1행)

다음 값을 사용하여 기존 레코드 수정젠 토토:

CREATE TABLE 테스트(col1 정수, col2 텍스트, col3 텍스트);
테스트 값에 삽입(123, 'foo', 'bar');

SELECT (r).* FROM (SELECT t #= '"col3"="baz"' AS r FROM test t) s;
 열1 | 열2 | col3 
------+------+------
  123 | 푸 | 바즈
(1행)

F.16.5. 통계

젠 토토유형, 본질적인 특성 때문에 자유도에는 다양한 키가 포함될 수 있습니다. 확인 중 유효한 키는 애플리케이션의 작업입니다. 다음 예 키를 확인하고 키를 가져오는 몇 가지 기술을 보여줍니다. 통계.

간단한 예:

SELECT * FROM Each('aaa=bq, b=NULL, ""=1');

테이블 사용:

SELECT (각(h)).key, (각(h)).value INTO stat FROM test젠 토토;

온라인 통계:

SELECT 키, 개수(*) FROM
  (SELECT (각(h)).key FROM test젠 토토) AS stat
  그룹별 키
  ORDER BY 카운트 DESC, 키;
    키 | 카운트
---------+-------
 라인 |   883
 쿼리 |   207
 위치 |   203
 노드 |   202
 공간 |   197
 상태 |   195
 공개 |   194
 제목 |   190
 조직 |   189
....................

F.16.6. 호환성

PostgreSQL 9.0 기준,젠 토토다음을 사용합니다 이전 버전과 내부 표현이 다릅니다. 이 텍스트 이후 덤프/복원 업그레이드에 장애물이 없습니다. (덤프에 사용된) 표현은 변경되지 않습니다.

바이너리 업그레이드의 경우 상위 호환성은 새로운 코드가 이전 형식의 데이터를 인식하도록 하여 유지됩니다. 이 데이터를 처리할 때 약간의 성능 저하가 수반됩니다. 아직 새 코드로 수정되지 않았습니다. 강제로 가능해요 다음을 수행하여 테이블 열의 모든 값을 업그레이드합니다.업데이트다음과 같은 진술:

UPDATE 테이블 이름 SET 젠 토토col = 젠 토토col || '';

또 다른 방법은 다음과 같습니다:

ALTER TABLE 테이블 이름 ALTER 젠 토토col TYPE 젠 토토 USING 젠 토토col || '';

테이블 변경메서드에는 테이블에 배타적 잠금을 설정했지만 테이블이 부풀어오르지는 않습니다. 이전 행 버전이 있는 테이블입니다.

F.16.7. 저자

올렉 바르투노프, 모스크바, 러시아 모스크바대학교

테오도르 시가예프, 모스크바, Delta-Soft Ltd., 러시아

Andrew Gierth의 추가 개선 사항, 영국