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

5.12. 사설 토토

PostgreSQL열을 허용합니다 가변 길이의 다차원 사설 토토로 정의되는 테이블. 내장 유형 또는 사용자 정의 유형의 사설 토토을 만들 수 있습니다. 그들의 사용을 설명하기 위해, 우리는이 테이블을 만듭니다 :

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

그림과 같이 사설 토토 데이터 유형은 Square를 추가하여 명명됩니다. 브래킷 ([])의 데이터 유형 이름으로 사설 토토 요소. 위의 명령은라는 테이블을 만듭니다.sal_empa 포함텍스트String (이름), 1 차원 유형정수(pay_by_quarter) 분기 별 직원의 급여 및 2 차원 사설 토토텍스트(일정)는 직원을 나타냅니다 주간 일정.

이제 우리는 일부를합니다삽입s. 그것을 관찰하십시오 사설 토토 값을 작성하려면 내에서 요소 값을 동봉합니다. 곱슬 괄호하고 쉼표로 분리하십시오. 당신이 C를 알고 있다면, 이것은입니다 구조 초기화에 대한 구문과 다릅니다. (자세한 내용 아래에 나타납니다.)

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

sal_emp에 삽입하십시오
    값 ( '캐롤',
    '20000, 25000, 25000, 25000',
    ' "talk", "consult",  "meeting"');

이제 쿼리를 실행할 수 있습니다sal_emp. 먼저, 우리는 싱글에 액세스하는 방법을 보여줍니다 한 번에 배열의 요소. 이 쿼리는 이름을 검색합니다 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 's의 첫 번째 항목을 검색합니다 일주일의 첫 이틀 일정 :

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

      일정
-------------------
 회의,""

우리는 또한 글을 쓸 수 있습니다

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

동일한 결과와 함께. 사설 토토 첨자 작업이 수행됩니다 구독이 작성된 경우 사설 토토 슬라이스를 나타냅니다. 형식으로Lower:어퍼. 1의 하한이 가정됩니다 하나의 값 만 지정된 첨자의 경우

사설 토토 값을 완전히 대체 할 수 있습니다 :

업데이트 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'
    여기서 이름 = '캐롤';

인접한 요소에 할당하여 배열을 확대 할 수 있습니다. 이미 존재하는 사람들 또는 슬라이스에 할당하여 이미 존재하는 데이터에 인접하거나 중복됩니다. 예를 들어, if 배열 값에는 현재 4 개의 요소가 있으며 5 개가 있습니다. 요소에 할당 된 업데이트 후사설 토토 [5]. 현재 이러한 방식으로 확대됩니다 다차원이 아닌 1 차원 배열 만 허용됩니다 배열.

사설 토토 슬라이스 할당은 그렇지 않은 사설 토토을 생성 할 수 있습니다. 하나의 기반 구역을 사용하십시오. 예를 들어에 할당 할 수 있습니다.사설 토토 [-2 : 7]-2에서 7로 실행되는 첨자 값

구문에 대한 구문테이블 생성허용 정의 할 고정 길이 어레이 :

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

그러나 현재 구현은 배열을 시행하지 않습니다 크기 한계 --- 동작은 배열과 동일합니다. 지정되지 않은 길이.

실제로 현재 구현은 시행되지 않습니다 크기의 수가 선언되었습니다. 특정 배열 요소 유형은 모두 같은 유형으로 간주됩니다. 크기 또는 치수 수에 관계없이. 따라서 숫자를 선언합니다 치수 또는 크기의테이블 생성단순히 문서화되며 런타임 동작에는 영향을 미치지 않습니다.

모든 배열 값의 현재 치수를 검색 할 수 있습니다. 와 함께array_dims기능 :

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

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

array_dims생산 A텍스트결과, 사람들이 읽는 것이 편리합니다 그러나 아마도 프로그램에는 그렇게 편리하지 않을 것입니다.

사설 토토에서 값을 검색하려면 각 값을 확인해야합니다. 사설 토토의. 이것은 손으로 할 수 있습니다 (크기를 알고 있다면 사설 토토) :

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

그러나 이것은 큰 사설 토토에 대해 빠르게 지루하게됩니다. 사설 토토의 크기를 알 수없는 경우 도움이되지 않습니다. 비록 그렇습니다 기본의 일부가 아닙니다PostgreSQL분포, 새로운 기능 및 운영자를 정의하는 확장 가능 사설 토토 값을 반복합니다. 이것을 사용하여 위의 쿼리가 가능합니다 BE:

select *에서 sal_emp에서 pay_by_quarter [1 : 4] * = 10000;

전체 사설 토토을 검색하려면 (지정된 열만이 아님) 사용할 수 있습니다 :

SELECT *에서 sal_emp에서 pay_by_quarter * = 10000;

또한 배열에 모든 행이있는 행을 찾을 수 있습니다. 다음과 같은 10,000과 같은 값

SELECT *에서 sal_emp에서 pay_by_quarter ** = 10000;

이 선택 모듈을 설치하려면를보십시오.Contrib/Array디렉토리postgresql소스 배포.

팁 :배열이 설정되지 않았습니다. 배열 사용 이전 단락에 설명 된 방식은 종종 데이터베이스 잘못 디자인. 배열 필드는 일반적으로 분할해야합니다 별도의 테이블로 꺼집니다. 테이블을 검색 할 수 있습니다 쉽게.

참고 :현재 배열의 제한 구현은 배열의 개별 요소가 할 수 없다는 것입니다 SQL NULL 값입니다. 전체 배열은 null로 설정할 수 있지만 일부 요소가있는 배열은없고 일부는 그렇지 않습니다. 이 문제를 해결하는 것은 할 일 목록에 있습니다.

사설 토토 입력 및 출력 구문외부 사설 토토 값의 표현은 항목으로 구성됩니다. I/O 변환 규칙에 따라 해석됩니다 사설 토토의 요소 유형과 사설 토토을 나타내는 장식 구조. 장식은 곱슬 괄호로 구성됩니다 (and) 주위 인접한 항목 사이의 사설 토토 값과 구분 기호 문자. 구분자 문자는 일반적으로 쉼표입니다 (,) 그러나 다른 것이 될 수 있습니다 : 결정됩니다 에 의해typdelim사설 토토의 요소 유형. (제공된 표준 데이터 유형 중 에서PostgreSQL배포, 유형Boxa 세미콜론 (;) 그러나 다른 모든 사람들은 사용합니다 Comma.) 다차원 배열에서 각 차원 (행, 비행기, 큐브 등)는 자체 수준의 곱슬 브레이스를 얻고 구분자는 인접한 곱슬 브레이시 사이에 작성해야합니다 같은 수준의 엔티티. 당신은 a 전에 공백을 쓸 수 있습니다 왼쪽 버팀대, 오른쪽 버팀대 후 또는 개별 품목 이전 끈. 그러나 품목 후의 공백은 무시되지 않습니다 선행의 공백을 건너 뛰고 다음 오른쪽까지 모든 것을 건너칩니다 버팀대 또는 구분 기자는 항목 값으로 간주됩니다.

사설 토토 요소 인용.위에 표시된대로, 글을 쓸 때 사설 토토 값은 개별 사설 토토 요소. 너필수요소 값이라면 그렇게하십시오 그렇지 않으면 사설 토토 값 파서를 혼동합니다. 예를 들어, 곱슬 버팀대, 쉼표 (또는 무엇이든 Delimiter Char 공백은 두 배로 인용해야합니다. 이중 견적을 넣기 위해 사설 토토 요소 값의 백 슬래시는 백 슬래시. 또는 Backslash-Escaping을 사용할 수 있습니다 그렇지 않으면 취할 수있는 모든 데이터 문자를 보호하십시오. 사설 토토 구문 또는 무시할 수있는 공백.

배열 출력 루틴은 요소 주위에 이중 인용문을 표시합니다. 값이 비어 있거나 곱슬 교정기를 포함하는 경우 값 구분 기호 문자, 이중 따옴표, 백 슬래시 또는 공백. 요소 값에 포함 된 이중 인용문 및 백 슬래시는 다음과 같습니다. 백 슬래시 에스케이프. 숫자 데이터 유형의 경우 안전합니다 이중 인용문은 나타나지 않지만 텍스트 데이터 유형의 경우 하나는 존재의 유무에 대처할 준비가되어 있어야합니다. 인용 부호. (이것은 7.2 이전의 행동의 변화입니다PostgreSQL릴리스)

팁 :SQL 명령에 작성한 내용을 기억하십시오 먼저 문자열 문자로 해석되고 정렬. 이것은 필요한 백 슬래시의 수를 두 배로 늘립니다. 을 위한 예, a텍스트사설 토토 값 백 슬래시와 이중 견적을 포함하여 쓰다

삽입 ... 값 ( ' "\\\\", "\\" "');

String-Literal 프로세서는 한 레벨을 제거합니다 백 슬래시, 사설 토토 값 파서에 도착하는 것이 같아요"\\", "\" ". 차례로, 에 공급되는 문자열텍스트데이터 유형 입력 루틴이 됨\and"각각. (우리가 일하고 있다면 입력 루틴이 백 슬래시를 처리 한 데이터 유형으로 특별히,BYTEA예를 들어, 우리는 할 수 있습니다 명령에 1 개를 얻으려면 8 개의 백 슬래시가 필요합니다. 저장된 사설 토토 요소로의 백 슬래시.)