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 삭제 ... }'
어디에서삭제구분자입니다 해당 유형에 대한 문자(에 기록됨)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행)
윈 토토 아래 첨자 숫자는 사각형 안에 기록됩니다 괄호. 기본적으로PostgreSQL1부터 시작하는 번호 매기기를 사용합니다. 윈 토토에 대한 규칙, 즉의 윈 토토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 name = 'Carol';
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 이름 = '캐롤';
저장된 배열 값은 다음에 할당하여 확대할 수 있습니다. 요소가 아직 존재하지 않습니다. 그 사이의 모든 위치 이전에 존재했으며 새로 할당된 요소는 널로 채워져 있습니다. 예를 들어, 배열마이어레이현재 4개의 요소가 있습니다. 다음에 할당된 업데이트 후 6개 요소마이어레이[6]; 마이어레이[5]null이 포함됩니다. 현재 이러한 방식으로 확대하는 것은 다차원 배열이 아닌 1차원 배열에만 허용됩니다. 배열.
첨자 할당을 사용하면 배열을 생성할 수 없습니다. 1부터 시작하는 첨자를 사용하세요. 예를 들어 다음과 같이 할당할 수 있습니다.마이어레이[-2:7]배열을 생성하려면 -2에서 7까지의 아래 첨자 값입니다.
새로운 배열 값은 다음을 사용하여 구성될 수도 있습니다. 연결 연산자,||:
배열 선택[1,2] || 윈 토토[3,4]; ?열? ----------- 1,2,3,4
연결 연산자를 사용하면 단일 요소가 1차원 윈 토토의 시작이나 끝 부분에 푸시됩니다. 그것 또한 두 가지를 허용합니다N-차원 윈 토토 또는N-차원 및 anN+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;
그러나 이는 대규모 윈 토토의 경우 빨리 지루해지며 윈 토토의 크기를 알 수 없으면 도움이 되지 않습니다. 안 대체 방법은에 설명되어 있습니다.섹션 9.23. 위의 쿼리 다음으로 대체될 수 있습니다:
SELECT * sal_emp에서 10000 = 임의(pay_by_quarter);
또한 배열에 모든 항목이 있는 행을 찾을 수 있습니다 다음을 포함하는 10000과 동일한 값:
SELECT * FROM sal_emp WHERE 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-50.
팁:윈 토토은 세트가 아닙니다. 특정 검색 윈 토토 요소는 데이터베이스 설계가 잘못되었다는 신호일 수 있습니다. 각 항목에 대한 행이 있는 별도의 테이블을 사용하는 것이 좋습니다. 그것은 윈 토토 요소가 될 것입니다. 이것은 더 쉬울 것입니다 검색할 수 있으며 많은 수에 대해 더 잘 확장될 가능성이 높습니다. 요소.
배열 값의 외부 텍스트 표현은 다음과 같이 구성됩니다. I/O 변환에 따라 해석되는 항목 배열의 요소 유형에 대한 규칙과 그에 따른 장식 배열 구조를 나타냅니다. 장식은 곱슬로 구성되어 있습니다. 중괄호({그리고}) 배열 값과 구분 기호 주위 인접한 항목 사이의 문자. 구분 기호 문자는 다음과 같습니다. 보통 쉼표(,) 하지만 다른 것: 그것은에 의해 결정됩니다.typdelim배열의 요소 유형 설정. 다음에서 제공되는 표준 데이터 유형 중에서PostgreSQL배포, 모두 쉼표를 사용합니다. 유형 제외상자, 이는 세미콜론(;). 다차원에서는 윈 토토, 각 차원(행, 평면, 큐브 등)은 고유한 차원을 갖습니다. 중괄호 수준 및 구분 기호는 사이에 작성해야 합니다. 같은 레벨의 인접한 중괄호 엔터티.
배열 출력 루틴은 주위에 큰따옴표를 넣습니다. 빈 문자열인 경우 요소 값은 중괄호를 포함합니다. 구분 기호 문자, 큰따옴표, 백슬래시 또는 흰색 공백 또는 단어와 일치NULL. 더블 요소 값에 포함된 따옴표와 백슬래시는 백슬래시로 이스케이프 처리되었습니다. 숫자 데이터 유형의 경우 다음과 같이 가정하는 것이 안전합니다. 큰따옴표는 절대 나타나지 않지만 텍스트 데이터의 경우 유형은 다음 중 하나에 대처할 준비가 되어 있어야 합니다. 또는 따옴표가 없습니다.
기본적으로 배열의 하한 인덱스 값은 크기는 1로 설정됩니다. 다른 하위 배열을 표현하려면 범위, 배열 아래 첨자 범위를 명시적으로 지정할 수 있습니다. 배열 내용을 쓰기 전에. 이 장식은 다음과 같이 구성됩니다. 대괄호([]32174_32250:) 사이에 구분 기호 문자가 있습니다. 윈 토토 차원 장식 뒤에는 등호()가 옵니다.=). 예를 들면:
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구성 매개변수를 설정할 수 있습니다.꺼짐인식을 억제하다NULLNULL로.
이전에 표시된 것처럼 배열 값을 쓸 때 다음을 사용할 수 있습니다. 개별 배열 요소를 큰따옴표로 묶어야 합니다. 당신은반드시그러면 그렇게 하세요 그렇지 않으면 요소 값이 배열 값 구문 분석기를 혼동하게 됩니다. 예를 들어 중괄호, 쉼표(또는 데이터 유형의 구분 기호 문자), 큰따옴표, 백슬래시, 또는 선행 또는 후행 공백은 큰따옴표로 묶어야 합니다. 비어 있음 문자열 및 단어와 일치하는 문자열NULL또한 인용되어야 합니다. 큰따옴표를 넣으려면 또는 인용된 배열 요소 값의 백슬래시인 경우 이스케이프 문자열을 사용하세요. 구문 앞에 백슬래시를 추가합니다. 또는 다음을 수행할 수 있습니다. 모든 데이터를 보호하려면 따옴표를 피하고 백슬래시 이스케이프를 사용하세요. 그렇지 않으면 배열 구문으로 간주되는 문자입니다.
왼쪽 중괄호 앞이나 오른쪽 중괄호 뒤에 공백을 추가할 수 있습니다 버팀대. 앞이나 뒤에 공백을 추가할 수도 있습니다. 개별 항목 문자열. 이 모든 경우에 공백은 무시됩니다. 그러나 큰따옴표 안의 공백은 요소 또는 공백이 아닌 공백으로 양쪽에 둘러싸여 있습니다. 요소의 문자는 무시되지 않습니다.
참고:당신이 SQL에 작성한 내용을 기억하십시오 명령은 먼저 문자열 리터럴로 해석됩니다. 그런 다음 배열로. 백슬래시 수가 두 배로 늘어납니다. 당신이 필요합니다. 예를 들어,텍스트백슬래시와 큰따옴표를 사용하려면 다음과 같이 작성해야 합니다.
삽입 ... 값 (E'"\\\\","\\""');이스케이프 문자열 프로세서는 다음 수준 중 하나를 제거합니다. 백슬래시를 사용하여 배열 값 파서에 도착하는 내용을 확인합니다. 처럼 보인다{"\\","\""}. 차례로, 에 공급되는 문자열텍스트데이터 유형의 입력 루틴은 다음과 같습니다.\그리고"각각. (만약 우리가 입력 루틴도 처리되는 데이터 유형으로 작업 특별히 백슬래시를 사용합니다.바이테아용 예를 들어, 최대 8개의 백슬래시가 필요할 수 있습니다. 저장된 윈 토토에 백슬래시 하나를 가져오는 명령 요소.) 달러 인용(참조섹션 4.1.2.4)를 사용하면 두 배로 늘릴 필요가 없습니다. 백슬래시.
팁:그어레이생성자 구문(참조섹션 4.2.12)은 종종 SQL에서 윈 토토 값을 쓸 때 윈 토토 리터럴 구문 명령. 에서어레이, 개인 요소 값은 동일한 방식으로 작성됩니다. 윈 토토의 구성원이 아닐 때 작성되었습니다.