이 문서는 지원되지 않는 PostgreSQL 버전에 대한 것입니다.
당신은 다음과 같은 페이지를 보고 싶을 수도 있습니다.PostgreSQL : 문서 : 17 : 8.15. 윈 토토버전 또는 위에 나열된 다른 지원 버전 중 하나를 사용하세요.

5.12. 사설 토토

포스트그레SQL다음 열을 허용합니다. 가변 길이 다차원 배열로 정의할 테이블입니다. 모든 내장 유형 또는 사용자 정의 유형의 배열을 생성할 수 있습니다. 사용법을 설명하기 위해 다음 테이블을 만듭니다.

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

표시된 바와 같이 사설 토토 데이터 유형은 사각형을 추가하여 이름이 지정됩니다. 대괄호([])을 데이터 유형 이름으로 사설 토토 요소. 위의 명령은라는 테이블을 생성합니다.sal_empa를 포함한 열 포함텍스트문자열 (이름), 유형의 1차원 사설 토토정수 (pay_by_quarter)는 직원의 분기별 급여 및 2차원 사설 토토텍스트 (일정)은 직원의 주간 일정입니다.

이제 우리는 몇 가지를 합니다삽입s. 그것을 관찰하십시오 사설 토토 값을 쓰려면 요소 값을 안에 넣습니다. 중괄호를 사용하고 쉼표로 구분합니다. C를 안다면, 이것은 구조를 초기화하는 구문과 다르지 않습니다. (자세한 내용은 아래에 나타납니다.)

sal_emp에 삽입
    VALUES('빌',
    '10000, 10000, 10000, 10000',
    '"회의", "점심", ');

sal_emp에 삽입
    VALUES('캐롤',
    '20000, 25000, 25000, 25000',
    '"대화", "상담", "회의"');

이제 우리는 다음에서 몇 가지 쿼리를 실행할 수 있습니다.sal_emp. 먼저 단일 액세스 방법을 보여줍니다. 한 번에 배열의 요소. 이 쿼리는 다음의 이름을 검색합니다. 2분기에 급여가 변경된 직원:

sal_emp에서 이름 선택 WHERE pay_by_quarter[1] < pay_by_quarter[2];

 이름
-------
 캐롤
(1행)

사설 토토 아래 첨자 숫자는 사각형 안에 기록됩니다 괄호. 기본적으로포스트그레SQL사설 토토에 대해 1부터 시작하는 번호 지정 규칙을 사용합니다. 사설 토토n요소는 다음으로 시작함사설 토토[1]다음으로 끝남사설 토토[n].

이 쿼리는 전체 급여의 3분기 급여를 검색합니다. 직원:

sal_emp에서 pay_by_quarter[3] 선택;

 분기별로 지불
----------------
          10000
          25000
(2행)

우리는 또한 배열의 임의의 직사각형 조각에 접근할 수 있습니다. 또는 하위 배열. 배열 슬라이스는 다음과 같이 표시됩니다.하한값:상한하나 이상의 어레이용 치수. 이 쿼리는 Bill's의 첫 번째 항목을 검색합니다. 한 주의 첫 이틀 일정:

일정 선택[1:2][1:1] FROM sal_emp WHERE 이름 = 'Bill';

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

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

일정 선택[1:2][1] FROM sal_emp WHERE 이름 = 'Bill';

같은 결과입니다. 사설 토토 첨자 작업이 수행되었습니다. 아래 첨자 중 하나라도 쓰여지면 사설 토토 슬라이스를 나타냅니다. 형식으로하위:상부. 하한은 1로 가정됩니다. 하나의 값만 지정된 아래 첨자의 경우.

사설 토토 값은 완전히 교체될 수 있습니다:

UPDATE sal_emp SET pay_by_quarter = '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개의 요소가 있습니다. 다음에 할당된 업데이트 이후의 요소사설 토토[5]. 현재는 이런 식으로 확대 다차원 배열이 아닌 1차원 배열에만 허용됩니다. 배열.

배열 슬라이스 할당을 통해 다음과 같은 배열을 생성할 수 있습니다. 1부터 시작하는 첨자를 사용하세요. 예를 들어 다음과 같이 할당할 수 있습니다.사설 토토[-2:7]사설 토토을 생성하려면 -2에서 7까지 실행되는 아래 첨자 값.

다음 구문테이블 생성허용합니다 정의할 고정 길이 사설 토토:

테이블 tictactoe 생성(
    제곱 정수[3][3]
);

그러나 현재 구현에서는 배열을 시행하지 않습니다. 크기 제한 --- 동작은 배열의 경우와 동일합니다. 길이가 지정되지 않았습니다.

실제로 현재 구현에서는 다음을 시행하지 않습니다. 차원 수를 선언했습니다. 특정 배열 요소 유형은 모두 동일한 유형으로 간주됩니다. 크기나 치수 수에 관계없이. 그래서 번호를 선언하면 치수 또는 크기테이블 생성단순한 문서이므로 런타임 동작에 영향을 주지 않습니다.

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

SELECT array_dims(schedule) FROM sal_emp WHERE name = 'Carol';

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

array_dims생성텍스트사람들이 읽기 편리한 결과입니다. 하지만 아마도 프로그램에는 그다지 편리하지 않을 것입니다.

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

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배포, 거기에 새로운 함수와 연산자를 정의하는 확장을 사용할 수 있습니다. 사설 토토 값을 반복합니다. 이를 사용하면 위의 쿼리는 될:

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

지정된 열뿐만 아니라 전체 배열을 검색하려면 다음을 사용할 수 있습니다:

SELECT * sal_emp에서 WHERE pay_by_quarter *= 10000;

또한 배열에 모든 항목이 포함된 행을 찾을 수 있습니다. 다음을 포함하는 10,000과 같은 값:

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

이 선택적 모듈을 설치하려면 다음을 보십시오.기여/사설 토토디렉토리PostgreSQL소스 배포.

팁:배열은 세트가 아닙니다. 배열을 사용하여 이전 단락에서 설명한 방식은 종종 데이터베이스 설계 오류. 배열 필드는 일반적으로 분할되어야 합니다. 별도의 테이블로 이동합니다. 테이블은 분명히 검색될 수 있습니다 쉽게.

참고:현재 어레이의 제한 사항 구현은 배열의 개별 요소가 SQL 널값이어야 합니다. 전체 배열을 null로 설정할 수 있지만 일부 요소는 null이고 일부는 null이 아닌 배열을 가질 수 없습니다. 이 문제를 해결하는 것이 할 일 목록에 있습니다.

사설 토토 입력 및 출력 구문.외부 배열 값의 표현은 다음 항목으로 구성됩니다. I/O 변환 규칙에 따라 해석됩니다. 배열의 요소 유형과 배열을 나타내는 장식 구조. 장식은 중괄호()로 구성됩니다.{그리고}) 주변 사설 토토 값에 인접한 항목 사이의 구분 기호 문자를 더한 값입니다. 구분 기호 문자는 일반적으로 쉼표()입니다.,) 그러나 다른 것일 수도 있습니다. 결정됩니다. 에 의해typdelim설정 사설 토토의 요소 유형. (제공되는 표준 데이터 유형 중 에서포스트그레SQL배포, 유형상자다음을 사용합니다. 세미콜론(;) 하지만 다른 모든 사람들은 쉼표.) 다차원 배열에서는 각 차원(행, 평면, 큐브 등)은 자체 수준의 중괄호를 갖습니다. 구분 기호는 인접한 중괄호 사이에 작성되어야 합니다. 같은 레벨의 엔터티. 앞에 공백을 쓸 수 있습니다. 왼쪽 중괄호, 오른쪽 중괄호 뒤 또는 개별 항목 앞 문자열. 그러나 항목 뒤의 공백은 무시되지 않습니다. 선행 공백을 건너뛰고 다음 오른쪽까지의 모든 항목 중괄호 또는 구분 기호가 항목 값으로 사용됩니다.

사설 토토 요소를 인용합니다.위와 같이 글을 쓸 때 사설 토토 값 주위에 큰따옴표를 쓸 수 있습니다. 개별 사설 토토 요소. 당신은반드시요소 값이 그렇지 않으면 배열 값 구문 분석기를 혼동하게 됩니다. 예를 들어, 중괄호, 쉼표(또는 구분 기호 문자), 큰따옴표, 백슬래시 또는 선행 공백은 큰따옴표로 묶어야 합니다. 큰따옴표를 넣거나 배열 요소 값의 백슬래시 앞에는 백슬래시. 또는 백슬래시 이스케이프를 사용하여 다음을 수행할 수 있습니다. 그렇지 않으면 다음과 같이 간주되는 모든 데이터 문자를 보호하십시오. 배열 구문 또는 무시할 수 있는 공백.

배열 출력 루틴은 요소 주위에 큰따옴표를 넣습니다. 값이 빈 문자열이거나 중괄호를 포함하는 경우 구분 기호 문자, 큰따옴표, 백슬래시 또는 공백. 요소 값에 포함된 큰따옴표와 백슬래시는 백슬래시로 이스케이프 처리되었습니다. 숫자 데이터 유형의 경우 다음과 같이 가정하는 것이 안전합니다. 큰따옴표는 절대 나타나지 않지만 텍스트 데이터 유형의 경우 존재 여부에 관계없이 대처할 준비가 되어 있어야 합니다. 따옴표. (이것은 7.2 이전의 동작 변경입니다.포스트그레SQL출시.)

팁:SQL 명령에 무엇을 쓰는지 기억하세요 먼저 문자열 리터럴로 해석된 다음 배열. 이렇게 하면 필요한 백슬래시 수가 두 배로 늘어납니다. 에 대한 예를 들어, a를 삽입하려면텍스트배열 값 백슬래시와 큰따옴표가 포함되어 있으면 다음을 수행해야 합니다. 쓰다

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

문자열 리터럴 프로세서는 다음 수준 중 하나를 제거합니다. 백슬래시를 사용하여 배열 값 파서에 도착하는 내용을 확인합니다. 처럼 보인다{"\\","\""}. 차례로, 문자열은에 공급됩니다.텍스트데이터 유형 입력 루틴은\그리고"각각. (우리가 일하고 있었다면 입력 루틴이 백슬래시도 처리하는 데이터 유형이 있는 경우 특별히,바이테아예를 들어, 우리는 하나를 얻으려면 명령에 최대 8개의 백슬래시가 필요합니다. 저장된 사설 토토 요소에 백슬래시를 추가합니다.)