이 문서는 지원되지 않는 버전의 PostgreSQL을위한 것입니다.
당신은에 대해 같은 페이지를 보려고 할 수 있습니다PostgreSQL : 문서 : 17 : 8.15. 윈 배트맨 토토버전 또는 위에 나열된 다른 지원되는 버전 중 하나입니다.

8.15. 배트맨 토토

PostgreSQL표의 열을 가변 길이의 다차원 배트맨 토토로 정의 할 수 있습니다. 내장 또는 사용자 정의 기본 유형, 열거 형 또는 복합 유형의 배트맨 토토을 만들 수 있습니다. 도메인의 배트맨 토토은 아직 지원되지 않았습니다.

8.15.1. 배트맨 토토 유형 선언

배트맨 토토 유형의 사용을 설명하기 위해이 테이블을 만듭니다.

테이블 생성 sal_emp (
    이름 텍스트,
    pay_by_quarter 정수 [],
    일정 텍스트 [] []
);

표시된대로, 배트맨 토토 데이터 유형은 사각형 브래킷을 추가하여 명명됩니다 ([]) 배트맨 토토 요소의 데이터 유형 이름으로. 위의 명령은라는 테이블을 만듭니다.sal_emp유형 열이있는텍스트(이름), 1 차원 유형의 1 차원 배트맨 토토정수(pay_by_quarter)는 분기 별 직원의 급여와 2 차원 배트맨 토토을 나타내는텍스트(일정), 직원의 주간 일정을 나타내는

구문에 대한 구문테이블 생성예를 들어 다음과 같이 정확한 배트맨 토토의 크기를 지정할 수 있습니다.

테이블 생성 tictactoe (
    사각형 정수 [3] [3]
);

그러나 현재 구현은 제공된 배트맨 토토 크기 한계를 무시합니다. 즉, 행동은 지정되지 않은 길이의 배트맨 토토과 동일합니다..

현재 구현은 선언 된 차원 수를 시행하지 않습니다. 특정 요소 유형의 배트맨 토토은 크기 또는 크기의 크기에 관계없이 동일한 유형으로 간주됩니다. 따라서 배트맨 토토 크기 또는 크기 수를 선언테이블 생성단순히 문서화입니다. 런타임 동작에는 영향을 미치지 않습니다.

키워드를 사용하여 SQL 표준을 준수하는 대체 구문배트맨 토토, 1 차원 배트맨 토토에 사용할 수 있습니다.pay_by_quarter:로 정의 될 수 있습니다.

pay_by_quarter 정수 배트맨 토토 [4],

또는 배트맨 토토 크기를 지정할 경우 :

pay_by_quarter 정수 배트맨 토토,

그러나 이전과 같이PostgreSQL어떤 경우에도 크기 제한을 시행하지 않습니다.

8.15.2. 배트맨 토토 값 입력

문자 그대로 상수로 배트맨 토토 값을 작성하려면 곱슬 버팀대 내의 요소 값을 둘러싸고 쉼표로 분리하십시오. (C를 알고 있다면, 이것은 초기화 구조에 대한 C 구문과 다르지 않습니다.) 요소 값에 대한 이중 인용문을 넣을 수 있으며 쉼표 또는 곱슬 괄호가 포함되어있는 경우 그렇게해야합니다. (자세한 내용은 아래에 나와 있습니다.) 따라서 배트맨 토토 상수의 일반적인 형식은 다음과 같습니다.

'val1 delim val2 delim... '

여기서delim|pg_type입력. 에 제공된 표준 데이터 유형 중PostgreSQL배포, 모두 쉼표를 사용합니다 (,), 유형을 제외하고Box세미콜론을 사용하는 (;). 각val는 배트맨 토토 요소 유형의 상수 또는 서브 어레이입니다. 배트맨 토토 상수의 예는 다음과 같습니다.

'1,2,3, 4,5,6, 7,8,9'

이 상수는 정수의 3 개의 서브 배달로 구성된 2 차원 3 x 3 어레이입니다.

배트맨 토토 상수의 요소를 null로 설정하려면 쓰기NULL요소 값의 경우. (상단 또는 소문자 변형NULL할 것입니다.) 실제 문자열 값을 원한다면"null", 그 주위에 이중 인용문을 넣어야합니다.

(이러한 종류의 배트맨 토토 상수는 실제로 논의 된 일반 유형 상수의 특별한 경우 일뿐입니다섹션 4.1.2.7. 상수는 처음에 문자열로 처리되어 배트맨 토토 입력 변환 루틴으로 전달됩니다. 명시 적 유형 사양이 필요할 수 있습니다.)

이제 우리는 일부를 보여줄 수 있습니다삽입진술 :

sal_emp에 삽입하십시오
    값 ( 'Bill',
    '10000, 10000, 10000, 10000',
    ' "meeting", "lunch",  "Training", "Presentation"');

sal_emp에 삽입하십시오
    값 ( '캐롤',
    '20000, 25000, 25000, 25000',
    ' "아침 식사", "컨설팅",  "회의", "점심"');

이전 두 삽입물의 결과는 다음과 같습니다.

SELECT * FROM SAL_EMP;
 이름 |      pay_by_quarter |                 일정
-------+-----------------------------------------------------------------------------------
 빌 | 10000,10000,10000,10000 | 회의, 점심, 훈련, 프레젠테이션
 캐롤 | 20000,25000,25000,25000 | 아침 식사, 컨설팅, 회의, 점심

다차원 배트맨 토토은 각 차원마다 일치하는 범위를 가져야합니다. 불일치는 예를 들어 오류가 발생합니다.

sal_emp에 삽입하십시오
    값 ( 'Bill',
    '10000, 10000, 10000, 10000',
    ' "meeting", "lunch",  "meeting"');
오류 : 다차원 배트맨 토토은 치수와 일치하는 배트맨 토토 표현식이 있어야합니다

the배트맨 토토생성자 구문도 사용할 수 있습니다 :

sal_emp에 삽입하십시오
    값 ( 'Bill',
    배트맨 토토 [10000, 10000, 10000, 10000],
    배트맨 토토 [[ 'Meeting', 'Lunch'], [ 'Training', 'Presentation']));

sal_emp에 삽입하십시오
    값 ( '캐롤',
    배트맨 토토 [20000, 25000, 25000, 25000],
    배트맨 토토 [[ '아침 식사', '컨설팅'], [ '회의', '점심']);

배트맨 토토 요소는 일반적인 SQL 상수 또는 표현임을 알 수 있습니다. 예를 들어, 문자열 리터럴은 배트맨 토토 리터럴에서 두 번 인용 대신 단일 인용됩니다. 그만큼배트맨 토토생성자 구문에 대해 자세히 설명합니다.섹션 4.2.12.

8.15.3. 배트맨 토토 액세스

이제 테이블에서 일부 쿼리를 실행할 수 있습니다. 먼저 배트맨 토토의 단일 요소에 액세스하는 방법을 보여줍니다. 이 쿼리는 2 분기에 급여가 변경된 직원의 이름을 검색합니다.

pay_by_quarter [1] < pay_by_quarter [2];

 이름
-------
 축가
(1 행)

배트맨 토토 첨자 번호는 정사각형 괄호 안에 기록됩니다. 기본적으로PostgreSQL배트맨 토토에 대한 하나의 숫자 컨벤션, 즉 배트맨 토토을 사용합니다.n요소는로 시작합니다.배트맨 토토 [1]배트맨 토토 [n].

이 쿼리는 모든 직원의 3 분기 급여를 검색합니다.

sal_emp에서 pay_by_quarter [3]를 선택하십시오.

 pay_by_quarter
---------------
          10000
          25000
(2 줄)

배트맨 토토 또는 서브 어레이의 임의의 직사각형 조각에도 액세스 할 수 있습니다. 배트맨 토토 슬라이스는 쓰기로 표시됩니다하위 바운드:상한하나 이상의 배트맨 토토 치수. 예를 들어,이 쿼리는 요가의 첫 이틀 동안 Bill의 일정에서 첫 번째 항목을 검색합니다.

sal_emp에서 일정을 선택하십시오 [1 : 2] [1 : 1] 여기서 name = 'bill';

        일정
-------------------------
 meeting, training

차원이 슬라이스로 작성되면, 즉 결장을 포함하면 모든 치수가 슬라이스로 처리됩니다. 단일 숫자 (결장 없음) 만있는 모든 치수는 1에서 지정된 숫자로 취급됩니다. 예를 들어,[2][1 : 2],이 예에서와 같이 :

sal_emp에서 일정을 선택하십시오 [1 : 2] [2] where name = 'bill';

                 일정
---------------------------------------------------
 회의, 점심, 훈련, 프레젠테이션

비 슬라이스 케이스와의 혼란을 피하기 위해 모든 차원에 슬라이스 구문을 사용하는 것이 가장 좋습니다 (예 :[1 : 2] [1 : 1], 아님[2] [1 : 1].

배트맨 토토 자체 또는 첨자 표현식이 NULL 인 경우 배트맨 토토 첨자 표현식이 NULL을 반환합니다. 또한 첨자가 배트맨 토토 경계 외부에 있으면 NULL이 반환됩니다 (이 경우 오류가 발생하지 않음). 예를 들어, if일정현재 차원이 있습니다[1 : 3] [1 : 2]그런 다음 참조일정 [3] [3]null을 생산합니다. 마찬가지로, 잘못된 수의 첨자가있는 배트맨 토토 참조는 오류가 아닌 널을 산출합니다.

배트맨 토토 자체 또는 첨자 표현식이 널 인 경우 배트맨 토토 슬라이스 표현식도 마찬가지로 널을 생성합니다. 그러나, 현재 배트맨 토토 경계 외부에있는 배트맨 토토 슬라이스를 선택하는 것과 같은 다른 경우, 슬라이스 표현식은 빈 (Zero-Dimensional) 배트맨 토토이 NULL 대신에 생성됩니다. (이것은 슬라이스가 아닌 행동과 일치하지 않으며 역사적 이유로 이루어집니다.) 요청 된 슬라이스가 배트맨 토토 경계와 부분적으로 겹치면 널을 반환하는 대신 겹치는 영역으로 조용히 줄어 듭니다..

모든 배트맨 토토 값의 현재 치수는로 검색 할 수 있습니다.array_dims기능 :

sal_emp에서 array_dims (일정)를 선택하여 이름 = 'carol';

 Array_dims
------------
 [1 : 2] [1 : 2]
(1 행)

array_dims생산텍스트결과, 사람들이 읽는 것이 편리하지만 프로그램에 불편 함. 치수는로 검색 할 수도 있습니다.array_upperArray_Lower, 지정된 배트맨 토토 치수의 상단과 하한을 각각 반환합니다.

sal_emp에서 array_upper (일정, 1)를 선택하여 이름 = 'carol';

 array_upper
-------------
           2
(1 행)

array_length지정된 배트맨 토토의 길이를 반환합니다 :

sal_emp에서 array_length (일정, 1)를 선택하여 이름 = 'carol';

 Array_Length
--------------
            2
(1 행)

추기경모든 차원에서 배트맨 토토에서 총 요소 수를 반환합니다. 효과적으로 호출하는 행의 수입니다Unnest수율 :

sal_emp에서 카디널리티 (일정)를 선택하십시오.

 카디널리티
-------------
           4
(1 행)

8.15.4. 배트맨 토토 수정

배트맨 토토 값을 완전히 대체 할 수 있습니다 :

업데이트 sal_emp set pay_by_quarter = '25000,25000,27000,27000'
    여기서 이름 = '캐롤';

또는 사용배트맨 토토표현 구문 :

업데이트 Sal_emp Set Pay_by_Quarter = 배트맨 토토 [25000,25000,27000,27000]
    여기서 이름 = '캐롤';

배트맨 토토은 단일 요소로 업데이트 될 수 있습니다 :

업데이트 sal_emp set pay_by_quarter [4] = 15000
    여기서 이름 = 'Bill';

또는 슬라이스로 업데이트 :

업데이트 Sal_emp Set Pay_by_Quarter [1 : 2] = '27000,27000'
    여기서 이름 = '캐롤';

아직 존재하지 않은 요소에 할당하여 저장된 배트맨 토토 값을 확대 할 수 있습니다. 이전에 존재하는 사람들과 새로 할당 된 요소 사이의 모든 위치는 널로 채워집니다. 예를 들어, 배트맨 토토MyArray현재 4 개의 요소가 있으며, 업데이트 한 후에는 6 개의 요소가 있습니다.MyArray [6];MyArray [5]NULL을 포함합니다. 현재 이러한 방식의 확대는 다차원 배트맨 토토이 아닌 1 차원 배트맨 토토에만 허용됩니다.

구독 할당을 사용하면 하나의 기반 첨자를 사용하지 않는 배트맨 토토을 생성 할 수 있습니다. 예를 들어에 할당 할 수 있습니다.MyArray [-2 : 7]-2에서 7까지의 위시 값이있는 배트맨 토토을 생성하려면

새로운 배트맨 토토 값은 연결 연산자를 사용하여 구성 할 수 있습니다.||:

배트맨 토토 선택 [1,2] || 배트맨 토토 [3,4];
 ?열?
----------
 1,2,3,4

연결 연산자는 단일 요소를 1 차원 배트맨 토토의 시작 또는 끝으로 밀어 낼 수 있도록합니다. 또한 두 가지를 받아들입니다n-차원 배트맨 토토 또는 ann-차원 및 ann+1-차원 배트맨 토토.

단일 요소가 1 차원 배트맨 토토의 시작 또는 끝으로 푸시되면 결과는 배트맨 토토 피연산자와 동일한 하한 첨자가있는 배트맨 토토입니다. 예를 들어:

array_dims를 선택하십시오 (1 || '[0 : 1] = 2,3':: int []);
 Array_dims
------------
 [0 : 2]
(1 줄)

array_dims를 선택하십시오 (배트맨 토토 [1,2] || 3);
 Array_dims
------------
 [1 : 3]
(1 행)

같은 수의 치수를 가진 두 개의 배트맨 토토이 연결되면 결과는 왼쪽 피연산자의 외부 치수의 하한 첨자를 유지합니다. 결과는 왼쪽 오페라의 모든 요소와 오른쪽 피연산자의 모든 요소를 포함하는 배트맨 토토입니다. 예를 들어:

array_dims를 선택하십시오 (Array [1,2] || 배트맨 토토 [3,4,5]);
 Array_dims
------------
 [1 : 5]
(1 줄)

Array_dims (Array [[1,2], [3,4]] || 배트맨 토토 [[5,6], [7,8], [9,0]]);
 Array_dims
------------
 [1 : 5] [1 : 2]
(1 행)

언제n-차원 배트맨 토토이 an의 시작 또는 끝으로 밀립니다n+1-차원 배트맨 토토은 위의 요소 배트맨 토토 사례와 유사합니다. 각n-차원 하위 배트맨 토토은 본질적으로의 요소입니다.n+1-차원 배트맨 토토의 외부 치수. 예를 들어:

array_dims를 선택하십시오 (Array [1,2] || 배트맨 토토 [[3,4], [5,6]]);
 Array_dims
------------
 [1 : 3] [1 : 2]
(1 행)

함수를 사용하여 배트맨 토토을 구성 할 수도 있습니다array_prepend, array_append또는array_cat. 처음 두 개는 1 차원 배트맨 토토 만 지원하지만array_cat다차원 배트맨 토토을 지원합니다. 몇 가지 예 :

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] ||를 선택하십시오 널;                - 노출되지 않은 널도 마찬가지입니다
 ?열?
---------
 1,2

위의 예에서, 파서는 연결 연산자의 한쪽에 정수 배트맨 토토이 있고 다른쪽에는 결정되지 않은 유형의 상수가 보입니다. 상수의 유형을 해결하기 위해 사용하는 휴리스틱은 연산자의 다른 입력 (이 경우 정수 배트맨 토토과 동일한 유형이라고 가정하는 것입니다. 따라서 연결 연산자는 대표하는 것으로 추정됩니다array_cat, 아님array_append. 그것이 잘못된 선택 일 때, 배트맨 토토의 요소 유형에 상수를 캐스팅하여 고정 될 수 있습니다. 하지만 명시 적 사용array_append선호하는 솔루션 일 수 있습니다.

8.15.5. 배트맨 토토 검색

배트맨 토토에서 값을 검색하려면 각 값을 확인해야합니다. 배트맨 토토의 크기를 알고 있다면 수동으로 수행 할 수 있습니다. 예를 들어:

select *에서 sal_emp에서 pay_by_quarter [1] = 10000 또는
                            pay_by_quarter [2] = 10000 또는
                            pay_by_quarter [3] = 10000 또는
                            pay_by_quarter [4] = 10000;

그러나 이것은 큰 배트맨 토토의 경우 빠르게 지루해지며 배트맨 토토의 크기를 알 수없는 경우 도움이되지 않습니다. 대체 방법이에 설명되어 있습니다.PostgreSQL : 문서 : 9.5 : 행 및 배열 토토. 위의 쿼리는 다음으로 대체 될 수 있습니다.

select *에서 sal_emp에서 10000 = any (pay_by_quarter);

또한 배트맨 토토의 모든 값이 10000과 같은 행을 찾을 수 있습니다.

SELECT *에서 sal_emp에서 10000 = ALL (pay_by_quarter);

또는 대안 적으로Generate_Subscripts함수를 사용할 수 있습니다. 예를 들어:

선택 *에서
   (pay_by_quarter를 선택하고
           generate_subscripts (pay_by_quarter, 1)
      sal_emp에서) foo로
 여기서 pay_by_quarter [s] = 10000;

이 함수는에 설명되어 있습니다.표 9-56.

를 사용하여 배트맨 토토도 검색 할 수도 있습니다.&&운영자, 왼쪽 피연산자가 오른쪽 피연산자와 겹치는지 확인합니다. 예를 들어:

select *에서 sal_emp where pay_by_quarter && array [10000];

이 및 기타 배트맨 토토 연산자는에 자세히 설명되어 있습니다.PostgreSQL : 문서 : 9.5 : 스포츠 토토 사이트 함수 및 연산자. 에 설명 된대로 적절한 색인으로 가속화 될 수 있습니다.스포츠 토토 사이트 : 문서 : 9.5 : 색인 유형.

를 사용하여 배트맨 토토에서 특정 값을 검색 할 수도 있습니다.array_positionarray_positions함수. 전자는 배트맨 토토에서 값의 첫 번째 발생 첨자를 반환합니다. 후자는 배트맨 토토에서 값의 모든 발생 위트 스크립트와 함께 배트맨 토토을 반환합니다. 예를 들어:

array_position (array [ 'sun', 'mon', 'tue', 'wed', 'thu', 'fri', 'sat', 'mon');
 Array_Positions
------------------
 2

array_positions (Array [1, 4, 3, 1, 3, 4, 2, 1], 1);
 Array_Positions
------------------
 1,4,8

팁 :배트맨 토토이 설정되지 않았습니다. 특정 배트맨 토토 요소를 검색하는 것은 데이터베이스 잘못 디자인의 징후 일 수 있습니다. 배트맨 토토 요소가 될 각 항목에 대해 행이있는 별도의 테이블을 고려하십시오. 이것은 검색하기가 더 쉬우 며 많은 요소에 대해 더 잘 확장 될 가능성이 높습니다.

8.15.6. 배트맨 토토 입력 및 출력 구문

배트맨 토토 값의 외부 텍스트 표현은 배트맨 토토의 요소 유형에 대한 I/O 변환 규칙에 따라 해석되는 항목과 배트맨 토토 구조를 나타내는 장식으로 구성됩니다. 장식은 곱슬 괄호로 구성됩니다 () 배트맨 토토 값과 인접 항목 사이의 구분 기호 문자. 구분자 문자는 일반적으로 쉼표입니다 (,) 그러나 다른 것이 될 수 있습니다 : 그것은에 의해 결정됩니다typdelim배트맨 토토의 요소 유형 설정. 에 제공된 표준 데이터 유형 중PostgreSQL분포, 모두 유형을 제외하고 쉼표를 사용합니다Box, 세미콜론을 사용하는 (;). 다차원 배트맨 토토에서 각 차원 (행, 평면, 큐브 등)은 고유 한 수준의 곱슬 버팀대를 가져 오며 구분자는 동일한 수준의 인접한 곱슬 브레이시 엔티티 사이에 작성해야합니다..

배트맨 토토 출력 루틴은 비어있는 줄, 곱슬 버팀대, 구분 기호 문자, 이중 인용문, 백 슬래시 또는 화이트 스페이스를 포함하거나 단어와 일치하는 경우 요소 값 주위에 이중 따옴표를 표시합니다.NULL. 요소 값에 내장 된 이중 인용문 및 백 슬래시는 백 슬래시로 향합니다. 숫자 데이터 유형의 경우 이중 인용문이 나타나지 않을 것이라고 가정하는 것이 안전하지만 텍스트 데이터 유형의 경우 인용문의 유무에 대처할 준비를해야합니다.

기본적으로 배트맨 토토 크기의 하한 인덱스 값이 하나로 설정됩니다. 다른 하한을 갖는 배트맨 토토을 나타내려면 배트맨 토토 위시 범위는 배트맨 토토 내용을 작성하기 전에 명시 적으로 지정할 수 있습니다. 이 장식은 사각형 괄호로 구성됩니다 ([]) 각 배트맨 토토 차원의 하부 및 상한 주위에 콜론 (:) 사이의 분리기 문자. 배트맨 토토 치수 장식과 동일한 부호가 이어집니다 (=). 예를 들어:

f1 [1] [-2] [3] as e1, f1 [1] [-1] [5]를 E2로 선택하십시오
 에서 ( '[1 : 1] [-2 : -1] [3 : 5] = 1,2,3, 4,5,6':: int [] as ss;

 E1 | E2
----+----
  1 |  6
(1 행)

배트맨 토토 출력 루틴에는 결과에 명시 적 차원이 포함됩니다.

요소에 기록 된 값이NULL(어떠한 경우 변형) 요소가 널로 사용됩니다. 인용문 또는 백 슬래시의 존재는이를 비활성화하고 문자 그대로 문자열 값을 허용합니다"null"입력 할 예정입니다. 또한 8.2 Pre-8.2 버전의 후진 호환성PostgreSQL, Thearray_nulls구성 매개 변수를 돌릴 수 있습니다OFF인식을 억제하려면NULL널로

앞에서 볼 수 있듯이 배트맨 토토 값을 작성할 때 모든 개별 배트맨 토토 요소 주변에서 이중 인용문을 사용할 수 있습니다. 너필수요소 값이 배트맨 토토 값 파서를 혼동하는 경우 그렇게하십시오. 예를 들어, 곱슬 브레이스, 쉼표 (또는 데이터 유형의 구분 기호 문자), 이중 인용문, 백 슬래시 또는 선두 또는 후행 공백을 포함하는 요소는 이중 인용해야합니다. 단어와 일치하는 빈 줄과 문자열NULL인용도 인용해야합니다. 인용 된 배트맨 토토 요소 값에 이중 견적 또는 백 슬래시를 넣으려면 Backslash로 우선합니다. 또는 따옴표를 피하고 백 슬래시 에스코핑을 사용하여 배트맨 토토 구문으로 취할 모든 데이터 문자를 보호 할 수 있습니다.

왼쪽 브레이스 앞이나 오른쪽 버팀대 후에 공백을 추가 할 수 있습니다. 개별 항목 문자열 전후에 공백을 추가 할 수도 있습니다. 이 모든 경우에 공백은 무시됩니다. 그러나 이중 인용 요소 내의 공백 또는 요소의 비 whitesce 문자에 의해 양쪽에 둘러싸여있는 공백은 무시되지 않습니다.

팁 :the배트맨 토토생성자 구문 (참조섹션 4.2.12)는 SQL 명령에 배트맨 토토 값을 작성할 때 배트맨 토토 문화 구문보다 작업하기가 더 쉽습니다. 안에배트맨 토토, 개별 요소 값은 배트맨 토토의 구성원이 아닌 경우 작성되는 것과 동일한 방식으로 작성됩니다.