토토열을 허용합니다 가변 길이의 다차원 토토로 정의되는 테이블. 내장 또는 사용자 정의 기본 유형, 열거 유형의 토토 또는 복합 유형을 만들 수 있습니다. 도메인의 토토은 아직 없습니다 지원.
토토 유형의 사용을 설명하기 위해 우리는 이것을 만듭니다. 테이블:
테이블 생성 sal_emp ( 이름 텍스트, pay_by_quarter 정수 [], 일정 텍스트 [] [] );
그림과 같이 토토 데이터 유형은 Square를 추가하여 명명됩니다. 브래킷 ([])의 데이터 유형 이름으로 토토 요소. 위의 명령은라는 테이블을 만듭니다.sal_emp유형 열이있는텍스트(이름), 1 차원 유형정수(pay_by_quarter) 분기 별 직원의 급여 및 2 차원 토토 의텍스트(일정)는 직원을 나타냅니다 주간 일정.
구문에 대한 구문테이블 생성허용 지정할 토토의 정확한 크기 (예 :
테이블 생성 tictactoe ( 사각형 정수 [3] [3] );
그러나 현재 구현은 제공된 모든 것을 무시합니다 토토 크기 제한, 즉 동작은 토토과 동일합니다. 지정되지 않은 길이의.
현재 구현은 선언 된 것을 시행하지 않습니다 치수 수. 특정 요소의 토토 유형은 모두 동일한 유형으로 간주됩니다. 크기 또는 치수 수. 토토 크기를 선언하거나 선언합니다 의 치수 수테이블 생성단순히 문서화입니다. 런타임에는 영향을 미치지 않습니다 행동.
SQL 표준을 준수하는 대체 구문. 키워드 사용토토, 사용할 수 있습니다 1 차원 토토의 경우.pay_by_quarter정의되었을 수 있습니다 처럼:
pay_by_quarter 정수 토토 [4],
또는 토토 크기를 지정할 경우 :
pay_by_quarter 정수 토토,
이전과 같이토토크기를 시행하지 않습니다 어떤 경우에도 제한.
토토 값을 문자 그대로 상수로 작성하려면 곱슬 버팀대 내의 요소 값과 쉼표로 분리하십시오. (C를 알고 있다면 이것은 C 구문과는 다릅니다. 구조 초기화.) 주위에 이중 인용문을 넣을 수 있습니다 요소 값, 쉼표 또는 곱슬이 포함 된 경우 그렇게해야합니다. 바지 멜빵. (자세한 내용은 아래에 표시됩니다.) 따라서 일반적인 형식입니다 토토 상수의 다음은 다음과 같습니다.
'val1 delim val2 delim... '
여기서delimDelimiter입니다 그 유형의 문자, 그 유형에 기록 된대로pg_type입력. 표준 데이터 유형 중 제공토토배포, 모두 쉼표를 사용합니다 (,), 유형을 제외하고Boxa 세미콜론 (;). 각val는 토토의 상수입니다 요소 유형 또는 서브 어레이. 토토 상수의 예 이다:
'1,2,3, 4,5,6, 7,8,9'
이 상수는 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', ' "아침 식사", "컨설팅", "회의", "점심"');
이전 두 삽입물의 결과는 다음과 같습니다.
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.11.
이제 테이블에서 일부 쿼리를 실행할 수 있습니다. 먼저, 우리는 보여줍니다 토토의 단일 요소에 액세스하는 방법. 이 쿼리 급여가 변경된 직원의 이름을 검색합니다. 2 분기 :
pay_by_quarter [1] < pay_by_quarter [2]; 이름 ------- 축가 (1 행)
토토 위시 번호는 정사각형 내에 기록됩니다 브래킷. 기본적으로토토1 기반 번호를 사용합니다 토토 컨벤션, 즉, 토토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이 반환됩니다. 경계 (이 경우 오류가 발생하지 않습니다). 예를 들어, if일정현재 차원이 있습니다[1 : 3] [1 : 2]그런 다음 참조일정 [3] [3]null을 생산합니다. 마찬가지로 토토 잘못된 수의 첨자로 참조하면 NULL이 생성됩니다. 오류보다는.
토토 슬라이스 표현식도 마찬가지로 널을 생성합니다. 그 자체 또는 모든 첨자 표현식은 무효입니다. 하지만, 토토 슬라이스 선택과 같은 다른 경우 현재 토토 경계 외부, 슬라이스 표현 NULL 대신 빈 (제로 차원) 토토을 생성합니다. (이것 비 슬라이스 행동과 일치하지 않으며 역사적으로 수행됩니다. 요청 된 슬라이스가 토토과 부분적으로 겹치는 경우 한계, 그러면 겹치는 것만으로 조용히 줄어 듭니다. Null을 반환하는 대신 지역.
모든 토토 값의 현재 치수를 검색 할 수 있습니다.
와 함께array_dims
기능 :
sal_emp에서 array_dims (일정)를 선택하여 이름 = 'carol'; Array_dims ------------ [1 : 2] [1 : 2] (1 행)
array_dims
생산텍스트결과, 편리합니다
사람들은 읽을 수 있지만 아마도 프로그램에 불편 함.
치수는로 검색 할 수도 있습니다.array_upper
andArray_Lower
, 상단과 하단을 반환합니다
지정된 토토 치수의 경계 :
sal_emp에서 array_upper (일정, 1)를 선택하여 이름 = 'carol'; array_upper ------------- 2 (1 행)
array_length
지정된 토토 치수의 길이 :
sal_emp에서 array_length (일정, 1)를 선택하여 이름 = 'carol'; Array_Length -------------- 2 (1 행)
토토 값을 완전히 대체 할 수 있습니다 :
업데이트 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-차원 토토 또는n-차원 및n+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-차원 토토 의 시작 또는 끝으로 밀려옵니다.n+1-차원 토토은 결과입니다 위의 요소 토토 사례와 유사합니다. 각n-차원 서브 어레이는 본질적으로 an입니다 요소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
다차원 토토을 지원합니다.
위에서 논의한 연결 연산자는 IS입니다
이러한 기능을 직접 사용하는 것보다 선호됩니다. 사실, 이것들
주로 구현에 사용하기위한 기능이 있습니다
연결 연산자. 그러나 직접 유용 할 수 있습니다
사용자 정의 집계의 생성에서. 몇 가지 예 :
array_prepend (1, array [2,3]); array_prepend ----------------- 1,2,3
토토에서 값을 검색하려면 각 값은 확인. 이는 크기를 알고 있다면 수동으로 수행 할 수 있습니다 정렬. 예를 들어:
select *에서 sal_emp에서 pay_by_quarter [1] = 10000 또는 pay_by_quarter [2] = 10000 또는 pay_by_quarter [3] = 10000 또는 pay_by_quarter [4] = 10000;
그러나 이것은 큰 토토에 대해 빠르게 지루하게됩니다 토토의 크기를 알 수없는 경우 도움이되지 않습니다. an 대체 방법은에 설명되어 있습니다.섹션 9.21. 위의 쿼리 대체 할 수 있습니다 :
select *에서 * sal_emp에서 10000 = any (pay_by_quarter);
또한 토토에 모든 행을 찾을 수 있습니다. 다음과 같은 값은 다음과 같습니다.
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-47.
팁 :토토이 설정되지 않았습니다. 구체적인 검색 토토 요소는 데이터베이스 잘못 디자인의 표시 일 수 있습니다. 각 항목에 대해 행이있는 별도 테이블 사용 고려 그것은 토토 요소 일 것입니다. 이것은 더 쉬울 것입니다 검색, 많은 수의에 대해 더 잘 확장 할 가능성이 강요.
토토 값의 외부 텍스트 표현은 구성됩니다 I/O 변환에 따라 해석되는 항목 토토의 요소 유형에 대한 규칙과 장식 토토 구조를 나타냅니다. 장식은 곱슬으로 구성됩니다 브레이스 (and) 토토 값과 구분 기호 주변 인접한 항목 사이의 문자. 구분자 캐릭터는입니다 보통 쉼표 (,) 다른 것 : 그것은에 의해 결정됩니다typdelim토토의 요소 유형 설정. 에 제공된 표준 데이터 유형 중토토배포, 모두 쉼표를 사용합니다. 유형을 제외하고Box, a 세미콜론 (;). 다차원에서 토토, 각 치수 (행, 평면, 큐브 등)는 자체적으로 얻습니다. 곱슬 버팀대의 수준과 구분 제는 사이에 기록해야합니다. 같은 수준의 인접한 곱슬 브레이시 엔티티.
토토 출력 루틴에는 이중 인용문이 있습니다 비어있는 끈 인 경우 요소 값은 곱슬 괄호를 포함하고, 구분 기호 문자, 이중 따옴표, 백 슬래시 또는 흰색 공간, 또는 단어 일치null. 더블 요소 값에 포함 된 따옴표와 백 슬래시가 있습니다 백 슬래시 에스케이프. 숫자 데이터 유형의 경우 안전합니다 그 이중 인용문은 결코 나타나지 않지만 텍스트 데이터의 경우 유형 1은 존재에 대처할 준비를해야합니다. 또는 인용문의 부재.
기본적으로 토토의 하한 인덱스 값 치수는 하나로 설정됩니다. 다른 낮은 토토을 나타냅니다 경계, 토토 첨자 범위는 명시 적으로 지정할 수 있습니다 토토 내용을 작성하기 전에. 이 장식은 구성됩니다 사각형 브래킷 ([]) 각 토토 주변 콜론 (과 함께 치수의 하부 및 상한:) 사이의 분리기 문자. 토토 치수 장식과 동일한 부호가 이어집니다 (=). 예를 들어:
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 이전 버전의 호환성토토, Thearray_nulls구성 매개 변수를 돌릴 수 있습니다OFF인식을 억제하려면NULL널로
이전에 표시된대로 토토 값을 작성할 때 사용할 수 있습니다. 개별 토토 요소 주변의 이중 인용문. 너필수요소 값은 그렇지 않으면 토토 값 파서를 혼동합니다. 예를 들어, 곱슬 버팀대, 쉼표 (또는 데이터 유형의 Delimiter 문자), 이중 따옴표, 백 슬래시, 또는 선도 또는 후행 공백은 두 번 인용해야합니다. 비어 있는 단어와 일치하는 문자열과 문자열NULL인용도 인용해야합니다. 이중 견적을 넣으려면 또는 인용 된 토토 요소 값의 BackSlash, Escape String을 사용하십시오. 구문 및 백 슬래시로 우선합니다. 또는 당신은 할 수 있습니다 견적을 피하고 백 슬래시 에스케이프를 사용하여 모든 데이터를 보호하십시오 그렇지 않으면 토토 구문으로 취할 문자
왼쪽 버팀대 앞이나 오른쪽 후에 공백을 추가 할 수 있습니다. 중괄호. 전후에 공백을 추가 할 수도 있습니다 개별 항목 문자열. 이 모든 경우에 공백 무시됩니다. 그러나 이중 인용 내에서의 공백 요소, 또는 비 whitespace에 의해 양쪽에 둘러싸여 있습니다 요소의 문자는 무시되지 않습니다.
참고 :SQL에 쓰는 내용을 기억하십시오 명령은 먼저 문자열 문자로 해석되며 그런 다음 토토로. 이것은 백 슬래시 수를 두 배로 늘립니다 당신은 필요합니다. 예를 들어, a를 삽입하려면텍스트백 슬래시를 포함하는 토토 값 및 a 이중 인용문, 당신은 다음을 쓸 필요가 있습니다 :
삽입 ... 값 (e ' "\\\\", "\\" "');Escape String 프로세서가 한 레벨을 제거합니다 백 슬래시, 토토 값 파서에 도착하는 것이 같아요"\\", "\" ". 차례로,텍스트데이터 유형의 입력 루틴이됩니다\및"각각. (우리가 그랬다면 입력 루틴도 처리 한 데이터 유형으로 작업 특별히 백 슬래시,BYTEA예를 들어, 우리는 저장된 토토에 하나의 백 슬래시를 가져 오려는 명령 요소.) 달러 인용 (참조섹션 4.1.2.4) 두 배를 피하기 위해 사용할 수 있습니다. 백 슬래시.
팁 :the토토생성자 구문 (참조섹션 4.2.11)는 종종 작업보다 작업하기가 더 쉽습니다 SQL에서 토토 값을 작성할 때 어레이-문자 구문 명령. 안에토토, 개인 요소 값은 동일한 방식으로 작성됩니다. 토토 멤버가 아닌 경우 작성.