| PostgreSQL 9.3.25 문서 | ||||
|---|---|---|---|---|
| 토토 캔 : 문서 : 9.3 : JSON 유형 | PostgreSQL : 문서 : 9.3 : 데이터 윈 토토 | 8장. 데이터 유형 | PostgreSQL : 문서 : 9.3 : 범퍼카 토토 유형 | |
PostgreSQL다음의 열을 허용합니다. 가변 길이 다차원 배열로 정의되는 테이블입니다. 내장 또는 사용자 정의 기본 유형, 열거형 유형 또는 복합형을 생성할 수 있습니다. 도메인 배열이 아직 없습니다. 지원됩니다.
배열 유형의 사용을 설명하기 위해 다음 테이블을 만듭니다.
테이블 생성 sal_emp(
이름 텍스트,
pay_by_quarter 정수[],
일정 텍스트[][]
);
표시된 바와 같이 토토 꽁 머니 데이터 유형은 사각형을 추가하여 이름이 지정됩니다. 대괄호([])을 데이터 유형 이름으로 토토 꽁 머니 요소. 위의 명령은라는 테이블을 생성합니다.sal_emp다음 유형의 열 포함텍스트 (이름), 1차원 토토 꽁 머니 유형정수 (pay_by_quarter)은 직원의 분기별 급여 및 2차원 토토 꽁 머니텍스트 (일정), 이는 직원의 주간 일정을 나타냅니다.
다음 구문테이블 생성허용합니다 지정할 배열의 정확한 크기입니다. 예를 들면 다음과 같습니다.
테이블 tictactoe 생성(
제곱 정수[3][3]
);
그러나 현재 구현에서는 제공된 배열을 무시합니다. 크기 제한, 즉 동작은 배열의 경우와 동일합니다. 길이가 지정되지 않았습니다.
현재 구현에서는 선언된 번호를 시행하지 않습니다. 차원 중 하나입니다. 특정 요소 유형의 배열은 모두 크기나 수에 관계없이 동일한 유형으로 간주됩니다. 치수. 따라서 배열 크기 또는 차원 수를 선언합니다.테이블 생성단순한 문서입니다. 그것 런타임 동작에는 영향을 미치지 않습니다.
다음과 같이 SQL 표준을 준수하는 대체 구문입니다. 키워드 사용어레이, 다음 용도로 사용할 수 있습니다. 1차원 토토 꽁 머니.pay_by_quarter다음과 같이 정의되었을 수 있습니다:
pay_by_quarter 정수 ARRAY[4],
또는 토토 꽁 머니 크기를 지정하지 않을 경우:
pay_by_quarter 정수 ARRAY,
그러나 이전과 마찬가지로,포스트그레SQL어떤 경우에도 크기 제한을 시행하지 않습니다.
배열 값을 리터럴 상수로 쓰려면 중괄호 안에 요소 값을 입력하고 쉼표로 구분합니다. (만약 C를 아시죠? 이것은 초기화를 위한 C 구문과 다르지 않습니다. 구조.) 모든 요소 값 주위에 큰따옴표를 넣을 수 있습니다. 쉼표나 중괄호가 포함된 경우에는 그렇게 해야 합니다. (자세한 내용은 아래에 나와 있습니다.) 따라서 배열 상수의 일반적인 형식은 다음과 같습니다. 다음:
'{ val1 삭제 발2 delim ... }'
어디에서삭제구분자입니다 해당 유형에 대한 문자(에 기록됨)pg_type항목. 표준 데이터 유형 중 에서 제공됨포스트그레SQL배포, 모두 쉼표를 사용합니다(,), 제외 유형에 대해상자세미콜론을 사용합니다. (;). 각각발은 배열 요소의 상수이거나 유형 또는 하위 배열. 배열 상수의 예는 다음과 같습니다.
'{{1,2,3},{4,5,6},{7,8,9}}'
이 상수는 다음으로 구성된 2차원 3x3 배열입니다. 세 개의 정수 하위 배열.
배열 상수의 요소를 NULL로 설정하려면 다음과 같이 작성하십시오.NULL요소 값에 대해. (모든 상위 또는 소문자 변형NULL그렇습니다.) 만약 실제 문자열 값을 원합니다."NULL", 주위에 큰따옴표를 넣어야 합니다.
(이런 종류의 토토 꽁 머니 상수는 실제로는 특별한 경우일 뿐입니다. 에서 논의된 일반 유형 상수 중섹션 4.1.2.7. 상수는 처음에는 문자열로 처리되며 토토 꽁 머니 입력 변환 루틴으로 전달됩니다. 명시적 유형 사양이 필요할 수 있습니다.)
이제 우리는 몇 가지를 보여줄 수 있습니다삽입문장:
sal_emp에 삽입
VALUES('빌',
'10000, 10000, 10000, 10000',
'"회의", "점심", "훈련", "발표"');
sal_emp에 삽입
VALUES('캐롤',
'20000, 25000, 25000, 25000',
'"아침 식사", "컨설팅", "회의", "점심"');
이전 두 삽입의 결과는 다음과 같습니다:
SELECT * FROM sal_emp; 이름 | 분기별 지급 | 일정 --------+---------------+------------------------------- 빌 | 10000,10000,10000,10000 | 회의,점심,교육,발표 캐롤 | 20000,25000,25000,25000 | 아침식사,컨설팅,회의,점심
다차원 토토 꽁 머니은 각각에 대해 일치하는 범위를 가져야 합니다 차원. 불일치로 인해 오류가 발생합니다. 예:
sal_emp에 삽입
VALUES('빌',
'10000, 10000, 10000, 10000',
'"회의", "점심", "회의"');
오류: 다차원 배열에는 차원이 일치하는 배열 표현식이 있어야 합니다.
그어레이생성자 구문은 또한 사용됩니다:
sal_emp에 삽입
VALUES('빌',
토토 꽁 머니[10000, 10000, 10000, 10000],
ARRAY[['회의', '점심'], ['훈련', '프레젠테이션']]);
sal_emp에 삽입
VALUES('캐롤',
토토 꽁 머니[20000, 25000, 25000, 25000],
ARRAY[['아침식사', '컨설팅'], ['회의', '점심']]);
토토 꽁 머니 요소는 일반 SQL 상수이거나 표현; 예를 들어 문자열 리터럴은 작은따옴표로 묶입니다. 토토 꽁 머니 리터럴에 있는 것처럼 큰따옴표로 묶는 대신.어레이생성자 구문은 다음에서 논의됩니다. 자세한 내용은섹션 4.2.12.
이제 테이블에서 몇 가지 쿼리를 실행할 수 있습니다. 먼저, 방법을 보여드리겠습니다. 배열의 단일 요소에 액세스합니다. 이 쿼리는 이름을 검색합니다. 2분기에 급여가 변경된 직원 수:
sal_emp에서 이름 선택 WHERE pay_by_quarter[1] < pay_by_quarter[2]; 이름 ------- 캐롤 (1행)
토토 꽁 머니 아래 첨자 번호는 대괄호 안에 기록됩니다. 기본적으로PostgreSQL다음을 사용합니다 배열에 대한 1부터 시작하는 번호 매기기 규칙, 즉n요소는 다음으로 시작함토토 꽁 머니[1]다음으로 끝남토토 꽁 머니[n].
이 쿼리는 모든 직원의 3분기 급여를 검색합니다:
sal_emp에서 pay_by_quarter[3] 선택;
분기별로 지불
----------------
10000
25000
(2행)
우리는 배열의 임의의 직사각형 조각에 접근할 수도 있습니다. 하위 배열. 배열 슬라이스는 다음과 같이 표시됩니다.하한값:상한하나 이상의 어레이용 치수. 예를 들어, 이 쿼리는 다음의 첫 번째 항목을 검색합니다. 한 주의 처음 이틀에 대한 Bill의 일정:
일정 선택[1:2][1:1] FROM sal_emp WHERE 이름 = 'Bill';
일정
-----------
회의,교육
어떤 차원이 슬라이스로 기록되면, 즉 콜론을 포함하는 경우, 그러면 모든 차원이 조각으로 처리됩니다. 다음을 포함하는 모든 차원 콜론 없이 단일 숫자만 1부터 다음 숫자까지로 처리됩니다. 지정된 번호. 예를 들어,[2]이다 다음과 같이 취급됨[1:2], 이 예에서와 같이:
일정 선택[1:2][2] FROM sal_emp WHERE 이름 = 'Bill';
일정
------------------------------
회의,점심,교육,발표
비슬라이스 사례와의 혼동을 피하기 위해 다음을 사용하는 것이 가장 좋습니다. 모든 차원에 대한 슬라이스 구문(예:[1:2][1:1]아님[2][1:1].
배열 아래 첨자 표현식은 다음 중 하나의 경우 null을 반환합니다. 배열 자체 또는 아래 첨자 표현식 중 하나가 null입니다. 또한, 첨자가 배열 범위를 벗어나면 null이 반환됩니다(이것은 경우에는 오류가 발생하지 않습니다). 예를 들어, 만약일정현재 크기가 있습니다[1:3][1:2]다음 참조일정[3][3]NULL을 생성합니다. 마찬가지로, 배열 잘못된 수의 첨자를 참조하면 오히려 null이 생성됩니다. 오류보다.
배열 슬라이스 표현식은 마찬가지로 배열이 다음과 같은 경우 null을 생성합니다. 자체 또는 아래 첨자 표현식 중 하나가 null입니다. 그러나 완전히 배열 슬라이스를 선택하는 등의 다른 경우 현재 배열 경계 외부에서 슬라이스 표현식은 다음을 생성합니다. null 대신 빈(0차원) 배열입니다. (이것은 그렇지 않습니다. 비슬라이스 동작과 일치하며 기록상의 이유로 수행됩니다.) 요청된 슬라이스가 배열 경계와 부분적으로 겹치는 경우 대신에 겹치는 영역으로 자동으로 축소됩니다. null을 반환합니다.
모든 배열 값의 현재 차원은 다음을 사용하여 검색할 수 있습니다.array_dims기능:
SELECT array_dims(schedule) FROM sal_emp WHERE name = 'Carol'; array_dims ------------ [1:2][1:2] (1행)
array_dims생성텍스트결과는 사람들이 읽기에는 편리하지만
프로그램에 불편할 수도 있습니다. 치수도 검색할 수 있습니다.
와 함께array_upper그리고array_lower, 상한값과 하한값을 반환합니다.
각각 지정된 배열 차원의 경계:
SELECT array_upper(일정, 1) FROM sal_emp WHERE 이름 = '캐롤';
array_upper
-------------
2
(1행)
토토 꽁 머니_길이다음을 반환합니다.
지정된 배열 차원의 길이:
SELECT array_length(schedule, 1) FROM sal_emp WHERE name = 'Carol';
토토 꽁 머니_길이
--------------
2
(1행)토토 꽁 머니 값은 완전히 교체될 수 있습니다:
UPDATE sal_emp SET pay_by_quarter = '25000,25000,27000,27000'
WHERE 이름 = '캐롤';
또는 다음을 사용하여어레이표현 구문:
UPDATE sal_emp SET pay_by_quarter = ARRAY[25000,25000,27000,27000]
WHERE 이름 = '캐롤';
토토 꽁 머니은 단일 요소에서도 업데이트될 수 있습니다:
UPDATE sal_emp SET pay_by_quarter[4] = 15000
WHERE 이름 = '빌';
또는 슬라이스에서 업데이트됨:
UPDATE sal_emp SET pay_by_quarter[1:2] = '27000,27000'
WHERE 이름 = '캐롤';
저장된 배열 값은 요소에 할당하여 확대할 수 있습니다. 아직 존재하지 않습니다. 이전에 존재했던 위치 사이의 모든 위치 새로 할당된 요소는 null로 채워집니다. 에 대한 예, 배열인 경우마이어레이현재 4개 있습니다 요소는 다음에 할당된 업데이트 후에 6개의 요소를 갖게 됩니다.마이어레이[6]; 마이어레이[5]null이 포함됩니다. 현재는 확대 이런 방식은 1차원 배열에만 허용됩니다. 다차원 토토 꽁 머니.
첨자 할당을 사용하면 다음을 사용하지 않는 배열을 생성할 수 있습니다. 1 기반 첨자. 예를 들어 다음과 같이 할당할 수 있습니다.마이어레이[-2:7]첨자로 배열을 생성하려면 -2에서 7까지의 값.
새로운 토토 꽁 머니 값은 연결을 사용하여 구성될 수도 있습니다 연산자,||:
배열 선택[1,2] || 토토 꽁 머니[3,4]; ?열? ----------- 1,2,3,4
연결 연산자를 사용하면 단일 요소를 푸시할 수 있습니다. 1차원 토토 꽁 머니의 시작이나 끝 부분에. 그것은 또한 두 개를 받아들입니다N차원 토토 꽁 머니, 또는N-차원 및N+1차원 토토 꽁 머니.
단일 요소가 시작 또는 끝으로 푸시될 때 1차원 토토 꽁 머니의 결과는 동일한 토토 꽁 머니입니다. 하한 첨자를 토토 꽁 머니 피연산자로 사용합니다. 예를 들면:
SELECT array_dims(1 || '[0:1]=2,3'::int[]); array_dims ------------ [0:2] (1줄) SELECT array_dims(ARRAY[1,2] || 3); array_dims ------------ [1:3] (1행)
동일한 차원 수를 가진 두 개의 토토 꽁 머니이 연결하면 결과는 하한 첨자를 유지합니다. 왼쪽 피연산자의 외부 차원. 결과는 토토 꽁 머니입니다 왼쪽 피연산자의 모든 요소와 그 뒤에 오는 모든 요소로 구성됩니다. 오른쪽 피연산자의 요소입니다. 예를 들면:
SELECT array_dims(ARRAY[1,2] || ARRAY[3,4,5]); array_dims ------------ [1:5] (1줄) SELECT array_dims(ARRAY[[1,2],[3,4]] || ARRAY[[5,6],[7,8],[9,0]]); array_dims ------------ [1:5][1:2] (1행)
때N차원 토토 꽁 머니은 의 시작이나 끝 부분에 푸시됨N+1차원 배열, 결과는 다음과 같습니다. 위의 요소 배열 사례와 유사합니다. 각각N차원 하위 토토 꽁 머니은 본질적으로 의 요소N+1-차원 토토 꽁 머니의 외부 차원. 예를 들면:
SELECT array_dims(ARRAY[1,2] || ARRAY[[3,4],[5,6]]); array_dims ------------ [1:3][1:2] (1행)
함수를 사용하여 토토 꽁 머니을 구성할 수도 있습니다.array_prepend, array_append또는array_cat. 처음 두 개만 지원합니다.
1차원 배열이지만array_cat다차원 배열을 지원합니다. 몇 가지 예:
SELECT array_prepend(1, ARRAY[2,3]); array_prepend --------------- 1,2,3
간단한 경우 위에서 설명한 연결 연산자는 다음과 같습니다. 이러한 기능을 직접 사용하는 것보다 선호됩니다. 그러나, 때문에 세 가지 경우를 모두 처리하기 위해 연결 연산자가 오버로드되었습니다. 기능 중 하나를 사용하는 것이 도움이 되는 상황이 있습니다. 모호함을 피하기 위해. 예를 들어 다음을 고려해보세요.
배열 선택[1, 2] || '3, 4'; -- 유형이 지정되지 않은 리터럴은 배열로 간주됩니다. ?열? ----------- 1,2,3,4 배열 선택[1, 2] || '7'; --이것도 마찬가지야 오류: 잘못된 배열 리터럴: "7" 배열 선택[1, 2] || NULL; -- 장식되지 않은 NULL도 마찬가지입니다. ?열? ---------- 1,2
위의 예에서 파서는 하나의 정수 배열을 봅니다.
연결 연산자의 측면 및 미정의 상수
다른쪽에 입력하십시오. 상수의 문제를 해결하는 데 사용하는 경험적 방법
유형은 연산자의 다른 유형과 동일한 유형이라고 가정하는 것입니다.
입력 — 이 경우 정수 배열입니다. 따라서 연결 연산자는
나타내는 것으로 추정됩니다array_cat,
아님array_append. 그럴 때
잘못된 선택은 상수를 캐스팅하여 수정할 수 있습니다.
토토 꽁 머니의 요소 유형; 하지만 명시적으로 사용함array_append바람직한 해결책이 될 수 있습니다.
토토 꽁 머니에서 값을 검색하려면 각 값을 확인해야 합니다. 토토 꽁 머니의 크기를 알고 있는 경우 이 작업을 수동으로 수행할 수 있습니다. 에 대한 예:
SELECT * FROM sal_emp WHERE pay_by_quarter[1] = 10000 OR
pay_by_quarter[2] = 10000 또는
pay_by_quarter[3] = 10000 또는
pay_by_quarter[4] = 10000;
그러나 이는 대규모 토토 꽁 머니의 경우 빨리 지루해지며 토토 꽁 머니의 크기를 알 수 없으면 도움이 되지 않습니다. 대안 방법은에 설명되어 있습니다.PostgreSQL : 문서 : 9.3 : 행 및 스포츠 토토 비교. 위 쿼리는 다음으로 대체될 수 있습니다.
SELECT * sal_emp에서 10000 = 임의(pay_by_quarter);
또한 토토 꽁 머니에 모든 값이 있는 행을 찾을 수 있습니다 10000과 같음:
SELECT * sal_emp에서 10000이 있는 곳 = 모두(pay_by_quarter);
또는,generate_subscripts함수를 사용할 수 있습니다. 에 대한
예:
SELECT * FROM
(분기별 지불 선택,
generate_subscripts(pay_by_quarter, 1) AS s
FROM sal_emp) AS foo
여기서 pay_by_quarter[s] = 10000;
이 기능은 다음에 설명되어 있습니다.표 9-51.
또한 다음을 사용하여 배열을 검색할 수 있습니다.&&연산자, 왼쪽 여부를 확인합니다. 피연산자가 오른쪽 피연산자와 겹칩니다. 예를 들어:
SELECT * sal_emp에서 WHERE pay_by_quarter && ARRAY[10000];
이것과 다른 배열 연산자는 다음에 더 자세히 설명되어 있습니다.섹션 9.18. 이는 다음과 같은 방법으로 가속화될 수 있습니다. 에 설명된 대로 적절한 인덱스섹션 11.2.
팁:토토 꽁 머니은 세트가 아닙니다. 특정 토토 꽁 머니 검색 요소는 데이터베이스 설계 오류의 징후일 수 있습니다. 사용을 고려해보세요 토토 꽁 머니이 될 각 항목에 대한 행이 있는 별도의 테이블 요소. 검색하기가 더 쉬우며 확장될 가능성이 높습니다. 많은 수의 요소에 더 좋습니다.
배열 값의 외부 텍스트 표현은 다음으로 구성됩니다. I/O 변환 규칙에 따라 해석되는 항목 배열의 요소 유형에 대한 추가 정보를 나타내는 장식 배열 구조. 장식은 중괄호로 구성됩니다. ({그리고}) 주변 토토 꽁 머니 값과 인접한 항목 사이의 구분 기호 문자입니다. 구분 기호 문자는 일반적으로 쉼표()입니다.,) 그러나 다른 것일 수도 있습니다. 이는 다음에 의해 결정됩니다.typdelim배열에 대한 설정 요소 유형. 다음에서 제공되는 표준 데이터 유형 중에서PostgreSQL배포, 모두 다음을 사용합니다. 쉼표(유형 제외)상자, 이는 세미콜론(;). 다차원에서는 토토 꽁 머니, 각 차원(행, 평면, 큐브 등)은 자체 수준을 갖습니다. 중괄호와 구분 기호는 인접한 중괄호 사이에 써야 합니다. 같은 레벨의 중괄호 엔터티입니다.
배열 출력 루틴은 요소 주위에 큰따옴표를 넣습니다. 값이 빈 문자열인 경우 중괄호, 구분 기호를 포함합니다. 문자, 큰따옴표, 백슬래시, 공백 또는 일치 단어NULL. 큰따옴표 및 요소 값에 포함된 백슬래시는 백슬래시로 이스케이프됩니다. 숫자 데이터 유형의 경우 큰따옴표가 다음과 같다고 가정하는 것이 안전합니다. 결코 나타나지 않지만 텍스트 데이터 유형의 경우 다음을 준비해야 합니다. 따옴표의 유무에 대처하십시오.
기본적으로 배열 차원의 하한 인덱스 값 1로 설정되어 있습니다. 다른 하한값을 사용하여 배열을 나타내려면 배열 첨자 범위는 쓰기 전에 명시적으로 지정할 수 있습니다. 배열 내용. 이 장식은 대괄호로 구성됩니다. ([]) 각 배열 차원의 하위 주위 및 상한, 콜론(:) 사이에 구분 기호 문자가 있습니다. 배열 차원 장식은 다음과 같습니다. 그 뒤에는 등호(=). 에 대한 예:
선택 f1[1][-2][3] AS e1, f1[1][-1][5] AS e2 FROM (SELECT '[1:1][-2:-1][3:5]=1,2,3,4,5,6'::int[] AS f1) AS ss; e1 | e2 ----+---- 1 | 6 (1행)
토토 꽁 머니 출력 루틴에는 명시적 차원이 포함됩니다. 하한이 하나 이상 다른 경우에만 결과가 나타납니다. 하나.
요소에 기록된 값이 다음과 같은 경우NULL(어떤 경우든 변형) 요소는 다음 위치로 이동됩니다. NULL이어야 합니다. 따옴표나 백슬래시가 있으면 이 기능이 비활성화됩니다. 리터럴 문자열 값을 허용합니다."NULL"입력됩니다. 또한 후진에 대해서는 8.2 이전 버전과의 호환성포스트그레SQL, 그array_nulls구성 매개변수를 설정할 수 있습니다.꺼짐인식을 억제하다NULL으로 NULL.
이전에 표시된 것처럼 배열 값을 쓸 때 다음을 사용할 수 있습니다. 개별 배열 요소를 큰따옴표로 묶어야 합니다. 당신은반드시요소 값이 그렇지 않으면 배열 값 구문 분석기를 혼동하게 됩니다. 예를 들어, 요소 중괄호, 쉼표(또는 데이터 유형의 구분 기호)를 포함합니다. 문자), 큰따옴표, 백슬래시, 선행 또는 후행 공백은 큰따옴표로 묶어야 합니다. 빈 문자열과 문자열 일치하는 단어NULL인용해야 합니다. 너무. 인용된 배열 요소에 큰따옴표나 백슬래시를 넣으려면 값 앞에 백슬래시를 붙입니다. 또는 피할 수 있습니다 모든 데이터 문자를 보호하려면 따옴표를 사용하고 백슬래시 이스케이프를 사용하세요. 그렇지 않으면 배열 구문으로 간주됩니다.
왼쪽 중괄호 앞이나 오른쪽 중괄호 뒤에 공백을 추가할 수 있습니다 버팀대. 개별 항목 앞이나 뒤에 공백을 추가할 수도 있습니다. 아이템 문자열. 이 모든 경우에 공백은 무시됩니다. 그러나 큰따옴표로 묶인 요소 내의 공백 또는 요소의 공백이 아닌 문자로 양면이 아닙니다. 무시됩니다.
팁:그어레이생성자 구문(참조섹션 4.2.12)는 종종 토토 꽁 머니 리터럴보다 작업하기가 더 쉽습니다. SQL 명령에 토토 꽁 머니 값을 쓸 때의 구문입니다. 에서어레이, 개별 요소 값은 토토 꽁 머니의 멤버가 아닐 때도 같은 방식으로 작성됩니다.