포스트그레SQL테이블의 열을 가변 길이 다차원 배열로 정의할 수 있습니다. 내장형 또는 사용자 정의 기본 유형, 열거형 또는 복합 유형의 배열을 생성할 수 있습니다. 도메인 배열은 아직 지원되지 않습니다.
배열 유형의 사용을 설명하기 위해 다음 테이블을 만듭니다.
테이블 생성 sal_emp(
이름 텍스트,
pay_by_quarter 정수[],
일정 텍스트[][]
);
표시된 바와 같이 토토 사이트 데이터 유형은 대괄호()를 추가하여 이름이 지정됩니다.[])을 토토 사이트 요소의 데이터 유형 이름으로 바꿉니다. 위의 명령은라는 테이블을 생성합니다.sal_emp다음 유형의 열 포함텍스트 (이름), 유형의 1차원 토토 사이트정수 (pay_by_quarter12197_12284텍스트 (일정), 직원의 주간 일정을 나타냅니다.
다음 구문테이블 생성배열의 정확한 크기를 지정할 수 있습니다. 예를 들면 다음과 같습니다.
테이블 tictactoe 생성(
제곱 정수[3][3]
);
그러나 현재 구현은 제공된 배열 크기 제한을 무시합니다. 즉, 동작은 지정되지 않은 길이의 배열과 동일합니다.
현재 구현에서는 선언된 차원 수도 적용하지 않습니다. 특정 요소 유형의 배열은 크기나 차원 수에 관계없이 모두 동일한 유형으로 간주됩니다. 따라서 배열 크기 또는 차원 수를 선언합니다.테이블 생성단순한 문서입니다. 런타임 동작에는 영향을 미치지 않습니다.
키워드를 사용하여 SQL 표준을 준수하는 대체 구문어레이, 1차원 토토 사이트에 사용할 수 있습니다.pay_by_quarter다음과 같이 정의되었을 수 있습니다:
pay_by_quarter 정수 ARRAY[4],
또는 토토 사이트 크기를 지정하지 않을 경우:
pay_by_quarter 정수 ARRAY,
그러나 이전과 마찬가지로,PostgreSQL어떤 경우에도 크기 제한을 시행하지 않습니다.
배열 값을 리터럴 상수로 쓰려면 요소 값을 중괄호로 묶고 쉼표로 구분하십시오. (C를 알고 있다면 이는 구조 초기화를 위한 C 구문과 다르지 않습니다.) 모든 요소 값 주위에 큰따옴표를 넣을 수 있으며, 쉼표나 중괄호가 포함된 경우에는 그렇게 해야 합니다. (자세한 내용은 아래에 나와 있습니다.) 따라서 배열 상수의 일반적인 형식은 다음과 같습니다.
'{ 발1 삭제 발2 삭제 ... }'
어디에서삭제는 해당 유형에 기록된 구분 문자입니다.pg_type항목. 다음에서 제공되는 표준 데이터 유형 중에서PostgreSQL배포, 모두 쉼표()를 사용합니다.,), 유형 제외상자세미콜론()을 사용합니다.;). 각발은 배열 요소 유형의 상수이거나 하위 배열입니다. 배열 상수의 예는 다음과 같습니다.
'{{1,2,3},{4,5,6},{7,8,9}}'
이 상수는 3개의 정수 하위 배열로 구성된 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의 일정에서 한 주의 처음 2일 동안의 첫 번째 항목을 검색합니다.하한값:상한
일정 선택[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].
생략 가능합니다.하한및/또는상한슬라이스 지정자; 누락된 경계는 배열 첨자의 하한 또는 상한으로 대체됩니다. 예를 들면:
SELECT 일정[:2][2:] FROM sal_emp WHERE 이름 = 'Bill';
일정
-----------
점심,프레젠테이션
토토 사이트 자체 또는 아래 첨자 표현식 중 하나가 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행)
카디널리티은 모든 차원에 걸쳐 토토 사이트의 총 요소 수를 반환합니다. 이는 실제로 호출할 행의 수입니다.unnest다음을 산출할 것입니다:
SELECT 카디널리티(일정) FROM sal_emp WHERE 이름 = '캐롤';
카디널리티
-------------
4
(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 또는 0차원이 아닌 배열 값을 업데이트하는 경우에만 사용할 수 있습니다(그렇지 않으면 대체할 기존 첨자 제한이 없습니다).
저장된 배열 값은 아직 존재하지 않는 요소에 할당하여 확장할 수 있습니다. 이전에 존재했던 요소와 새로 할당된 요소 사이의 모든 위치는 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 : 문서 : 10 : 9.23. 행 및 배열 스포츠 토토 결과. 위 쿼리는 다음으로 대체될 수 있습니다.
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.59.
또한 다음을 사용하여 배열을 검색할 수 있습니다.&&연산자, 왼쪽 피연산자가 오른쪽 피연산자와 겹치는지 확인합니다. 예를 들어:
SELECT * sal_emp에서 WHERE pay_by_quarter && ARRAY[10000];
이 연산자와 다른 배열 연산자는 다음에 자세히 설명되어 있습니다.PostgreSQL : 문서 : 10 : 9.18. 사설 토토 사이트 기능 및 연산자. 다음에 설명된 대로 적절한 인덱스를 통해 가속화될 수 있습니다.와이즈 토토 : 문서 : 10 : 11.2. 색인 유형.
또한 다음을 사용하여 배열의 특정 값을 검색할 수 있습니다.토토 사이트_위치그리고토토 사이트_위치함수. 전자는 토토 사이트에서 처음 나타나는 값의 첨자를 반환합니다. 후자는 토토 사이트에 있는 모든 값의 첨자가 있는 토토 사이트을 반환합니다. 예를 들면:
SELECT array_position(ARRAY['일','월','화','수','목','금','토'], '월'); 토토 사이트_위치 ----------------- 2 SELECT 토토 사이트_위치(ARRAY[1, 4, 3, 1, 3, 4, 2, 1], 1); 토토 사이트_위치 ----------------- 1,4,8
토토 사이트은 세트가 아닙니다. 특정 토토 사이트 요소를 검색하는 것은 데이터베이스 설계가 잘못되었다는 신호일 수 있습니다. 토토 사이트 요소가 될 각 항목에 대한 행이 있는 별도의 테이블을 사용하는 것이 좋습니다. 이렇게 하면 검색하기가 더 쉬워지고 많은 수의 요소에 대해 더 잘 확장될 가능성이 높습니다.
배열 값의 외부 텍스트 표현은 배열 요소 유형에 대한 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 이전 버전과의 호환성을 위해PostgreSQL, 그array_nulls구성 매개변수를 설정할 수 있습니다.꺼짐인식을 억제하다NULLNULL로.
이전에 표시된 것처럼 배열 값을 작성할 때 개별 배열 요소 주위에 큰따옴표를 사용할 수 있습니다. 당신은반드시요소 값이 토토 사이트 값 구문 분석기를 혼란스럽게 한다면 그렇게 하세요. 예를 들어 중괄호, 쉼표(또는 데이터 유형의 구분 기호 문자), 큰따옴표, 백슬래시 또는 선행 또는 후행 공백이 포함된 요소는 큰따옴표로 묶어야 합니다. 빈 문자열 및 단어와 일치하는 문자열NULL또한 인용되어야 합니다. 인용된 토토 사이트 요소 값에 큰따옴표나 백슬래시를 넣으려면 그 앞에 백슬래시를 놓으십시오. 또는 따옴표를 피하고 백슬래시 이스케이프 처리를 사용하여 토토 사이트 구문으로 간주되는 모든 데이터 문자를 보호할 수 있습니다.
왼쪽 중괄호 앞이나 오른쪽 중괄호 뒤에 공백을 추가할 수 있습니다. 개별 항목 문자열 앞이나 뒤에 공백을 추가할 수도 있습니다. 이 모든 경우에 공백은 무시됩니다. 그러나 큰따옴표로 묶인 요소 내의 공백이나 요소의 공백이 아닌 문자로 양쪽이 둘러싸인 경우는 무시되지 않습니다.
그어레이생성자 구문(참조섹션 4.2.12)는 SQL 명령에 토토 사이트 값을 쓸 때 토토 사이트 리터럴 구문보다 작업하기 쉬운 경우가 많습니다. 에서어레이, 개별 요소 값은 토토 사이트의 구성원이 아닐 때 작성되는 것과 동일한 방식으로 작성됩니다.