thetablefunc
모듈에는 테이블을 반환하는 다양한 기능 (즉, 여러 행)이 포함되어 있습니다. 이러한 기능은 여러 행을 반환하는 C 함수를 작성하는 방법의 예로 그 자체로 유용합니다.
이 모듈이 고려됩니다“신뢰할 수있는”Create
현재 데이터베이스의 권한.
테이블 F.31tablefunc
모듈.
표 F.31. tablefunc
기능
normal_rand
normal_rand (int numvals, float8 mean, float8 stddev) setof float8을 반환합니다
normal_rand
정규 분포 임의 값 세트 (가우스 분포)를 생성합니다.
numvals
함수에서 반환 할 값 수입니다.평균
값은 값의 정규 분포의 평균이며stddev
값의 정규 분포의 표준 편차입니다.
예를 들어,이 호출은 평균 5이고 표준 편차가 3 :의 1000 값을 요청합니다.
test =# select * from normal_rand (1000, 5, 3); normal_rand ------------------------ 1.56556322244898 9.10040991424657 5.36957140345079 -0.369151492880995 0.283600703686639 . . . 4.82992125404908 9.71308014517282 2.49639286969028 (1000 줄)
Crosstab (토토 캔)
Crosstab (Text SQL) crosstab (토토 캔 SQL, int n)
theCrosstab
함수는 생산에 사용됩니다“Pivot”디스플레이, 여기서 데이터는 다운이 아닌 페이지에 나열됩니다. 예를 들어,와 같은 데이터가있을 수 있습니다.
ROW1 VAL11 ROW1 VAL12 ROW1 VAL13 ... ROW2 VAL21 ROW2 VAL22 ROW2 VAL23 ...
우리가 표시하고 싶은
ROW1 VAL11 VAL12 VAL13 ... ROW2 VAL21 VAL22 VAL23 ... ...
theCrosstab
함수는 첫 번째 방식으로 형식으로 원시 데이터를 생성하는 SQL 쿼리 인 토토 캔 매개 변수를 가져 와서 두 번째 방식으로 형식화 된 테이블을 생성합니다.
theSQL
매개 변수는 소스 데이터 세트를 생성하는 SQL 문입니다. 이 진술은 하나를 반환해야합니다row_name
열, 하나카테고리
열, 1value
열.n
는 쓸모없는 매개 변수입니다.
예를 들어, 제공된 쿼리는 다음과 같은 세트를 생성 할 수 있습니다.
ROW_NAME CAT 값 ----------+-------+------- ROW1 CAT1 VAL1 ROW1 CAT2 VAL2 ROW1 CAT3 VAL3 ROW1 CAT4 VAL4 ROW2 CAT1 VAL5 ROW2 CAT2 VAL6 ROW2 CAT3 VAL7 Row2 CAT4 VAL8
theCrosstab
함수는 반환으로 선언 됨Setof Record
, 따라서 출력 열의 실제 이름과 유형은에 정의되어야합니다.From
전화 조항select
진술, 예 :
선택 *에서 Crosstab ( '...')에서 CT (row_name 토토 캔, 카테고리 _1 토토 캔, Category_2 토토 캔);로 선택하십시오.
이 예제는 다음과 같은 세트를 생성합니다.
<== 값 열 == row_name 카테고리 _1 카테고리 _2 ----------+-----------+------------- ROW1 VAL1 VAL2 Row2 Val5 Val6
theFrom
조항은 출력을 하나로 정의해야합니다row_name
열 (SQL 쿼리의 첫 번째 결과 열과 동일한 데이터 유형)과 N 열value
열 (SQL 쿼리의 세 번째 결과 열과 동일한 데이터 유형). 원하는만큼의 출력 값 열을 설정할 수 있습니다. 출력 열의 이름은 귀하에게 달려 있습니다.
theCrosstab
함수는 각 연속 입력 행 그룹에 대해 하나의 출력 행을 생성합니다.row_name
값. 출력을 채 웁니다value
열, 왼쪽에서 오른쪽으로value
이 행의 필드. 그룹에 출력이있는 것보다 행이 적은 경우value
열, 추가 출력 열에는 널로 채워집니다. 행이 더 많으면 추가 입력 행이 건너 뜁니다.
실제로 SQL 쿼리는 항상 지정해야합니다주문 1,2 주문
입력 행이 올바르게 주문되어 있는지 확인합니다. 즉, 동일 한 값row_name
는 함께 모여 행 내에서 정확하게 주문됩니다. 주석Crosstab
자체는 쿼리 결과의 두 번째 열에주의를 기울이지 않습니다. 3 열 값이 페이지를 가로 질러 나타나는 순서를 제어하기 위해 주문해야합니다.
여기에 완전한 예가 있습니다 :
테이블 CT 생성 (ID Serial, Rowid 토토 캔, 속성 토토 캔, 값 토토 캔); CT (rowid, 속성, 값) 값 ( 'test1', 'att1', 'val1')에 삽입; CT (rowid, 속성, 값) 값 ( 'test1', 'att2', 'val2')에 삽입; CT (rowid, 속성, 값) 값 ( 'test1', 'att3', 'val3')에 삽입; CT (rowid, 속성, 값) 값 ( 'test1', 'att4', 'val4')에 삽입; CT (rowid, 속성, 값) 값 ( 'test2', 'att1', 'val5')에 삽입; CT (rowid, 속성, 값) 값 ( 'test2', 'att2', 'val6')에 삽입; CT (rowid, 속성, 값) 값 ( 'test2', 'att3', 'val7')에 삽입; CT (rowid, 속성, 값) 값 ( 'test2', 'att4', 'val8')에 삽입; 선택하다 * Crosstab에서 ( 'Rowid, 속성, 값을 선택하십시오 CT에서 여기서 속성 = ''att2 ''또는 attribute = ''att3 '' 1,2 '로 주문 CT (row_name 토토 캔, 카테고리 _1 토토 캔, 카테고리_2 토토 캔, Category_3 토토 캔); row_name | 카테고리 _1 | 카테고리 _2 | 카테고리 _3 -----------+------------+------------+------------ test1 | Val2 | val3 | test2 | Val6 | val7 | (2 줄)
항상 a를 쓰지 않아도됩니다.from
조항은 정의에 연결된 원하는 출력 행 유형을 갖는 사용자 정의 CrosStab 함수를 설정하여 출력 열을 정의하는 절입니다. 이것은 다음 섹션에 설명되어 있습니다. 또 다른 가능성은 필요한 것을 포함시키는 것입니다보기 정의의 조항.
참조\ crosstabview
명령에서PSQL,와 유사한 기능을 제공합니다crosstab ()
.
Crosstabn
(토토 캔)
Crosstabn
(토토 캔 SQL)
theCrosstab
기능은 일반을위한 사용자 정의 포장지를 설정하는 방법의 예입니다n
Crosstab
함수, 호출에 열 이름과 유형을 쓸 필요가 없도록select
쿼리. 그만큼탁자
모듈 포함Crosstab2
, Crosstab3
및Crosstab4
, 출력 행 유형은로 정의됩니다.
유형 생성 tablefunc_crosstab_n as ( row_name 토토 캔, 카테고리 _1 토토 캔, 카테고리 _2 토토 캔, . . . 카테고리_n 토토 캔 );
따라서 이러한 기능은 입력 쿼리가 생성 될 때 직접 사용할 수 있습니다row_name
및value
유형의 열토토 캔
, 2, 3 또는 4 개의 출력 값 열을 원합니다. 다른 모든면에서 그들은 일반에 대해 위에서 설명한대로 정확하게 행동합니다Crosstab
기능.
예를 들어, 이전 섹션에 주어진 예제도로 작동합니다.
선택 * Crosstab3에서 ( 'Rowid, 속성, 값을 선택하십시오 CT에서 여기서 속성 = ''att2 ''또는 attribute = ''att3 '' 주문 1,2 ');
이 기능은 주로 그림 목적으로 제공됩니다. 기본에 따라 자신의 반환 유형 및 기능을 만들 수 있습니다crosstab ()
함수. 그렇게하는 두 가지 방법이 있습니다 :
예제와 유사한 원하는 출력 열을 설명하는 복합 유형 생성Contrib/TableFunc/TableFunc-1.0.SQL
. 그런 다음 고유 한 기능 이름을 정의하여 하나를 수락합니다토토 캔
매개 변수 및 반환setof your_type_name
그러나 동일한 기본에 연결Crosstab
C 함수. 예를 들어, 소스 데이터가의 행 이름을 생성하는 경우토토 캔
및 값float8
, 그리고 당신은 5 개의 값 열을 원합니다 :
생성 유형 my_crosstab_float8_5_cols as ( my_row_name 토토 캔, my_category_1 float8, my_category_2 float8, my_category_3 float8, my_category_4 float8, my_category_5 float8 ); 기능 작성 또는 교체 Crosstab_float8_5_cols (토토 캔) my_crosstab_float8_5_cols를 반환합니다 '$ libdir/tablefunc', 'Crosstab'Language C 안정적인 엄격;
useout
반환 유형을 암시 적으로 정의하는 매개 변수. 동일한 예제도 다음 방식으로 수행 할 수 있습니다.
함수 생성 또는 교체 Crosstab_float8_5_cols ( 토토 캔로 my_row_name 토토 캔를 끄고 out my_category_1 float8, out my_category_2 float8, out my_category_3 float8, out my_category_4 float8, out my_category_5 float8) Setof 레코드를 반환합니다 '$ libdir/tablefunc', 'Crosstab'Language C 안정적인 엄격;
Crosstab (토토 캔, 토토 캔)
crosstab (토토 캔 source_sql, text category_sql)
단일 파라미터 형태의 주요 제한Crosstab
는 그룹의 모든 값을 모두 처리하여 각 값을 첫 번째 사용 가능한 열에 삽입한다는 것입니다. 값 열이 특정 범주의 데이터에 해당하도록하려면 일부 그룹에 일부 카테고리에 대한 데이터가 없을 수 있으시면 잘 작동하지 않습니다. 2 파라미터 형태의Crosstab
출력 열에 해당하는 범주의 명시 적 목록을 제공 하여이 케이스를 처리합니다.
source_sql
는 소스 데이터 세트를 생성하는 SQL 문입니다. 이 진술은 하나를 반환해야합니다row_name
열, 하나카테고리
열, 1value
열. 또한 하나 이상이있을 수 있습니다“추가”열. 그만큼row_name
열이 먼저 있어야합니다. 그만큼카테고리
andvalue
열은 그 순서대로 마지막 두 열이어야합니다. 사이의 모든 열row_name
and카테고리
“추가”. 그만큼“추가”열은 동일 한 모든 행에 대해 동일 할 것으로 예상row_name
value.
예를 들어source_sql
다음과 같은 세트를 생성 할 수 있습니다.
선택을 선택하십시오. row_name extra_col cat 값 ----------+------------+-----+------- ROW1 Extra1 CAT1 VAL1 ROW1 Extra1 CAT2 VAL2 ROW1 Extra1 CAT4 VAL4 ROW2 Extra2 CAT1 VAL5 Row2 Extra2 CAT2 VAL6 ROW2 Extra2 CAT3 VAL7 Row2 Extra2 CAT4 VAL8
Category_SQL
는 범주 세트를 생성하는 SQL 문입니다. 이 진술은 하나의 열만 리턴해야합니다. 적어도 하나의 행을 생성해야합니다. 그렇지 않으면 오류가 생성됩니다. 또한 중복 값을 생성해서는 안됩니다. 그렇지 않으면 오류가 생성됩니다.Category_SQL
foo 주문에서 1 씩 고유 한 고양이를 선택하십시오. 고양이 ------- CAT1 cat2 cat3 CAT4
theCrosstab
함수는 반환으로 선언되었습니다Setof Record
, 따라서 출력 열의 실제 이름과 유형은에 정의되어야합니다.From
호출 조항select
진술, 예 :
선택 * From Crosstab ( '...', '...') CT (row_name 토토 캔, 추가 토토 캔, CAT1 토토 캔, CAT2 토토 캔, CAT3 토토 캔, CAT4 토토 캔);로
이것은 다음과 같은 결과를 낳습니다.
<== 값 열 == Row_name 추가 Cat1 Cat2 Cat3 Cat4 ---------+-------+------+------+------+------ ROW1 Extra1 VAL1 VAL2 VAL4 Row2 Extra2 VAL5 VAL6 VAL7 VAL8
theFrom
절은 적절한 데이터 유형의 적절한 출력 열을 정의해야합니다. 있는 경우n
열의 열source_sql
쿼리 결과, 첫 번째n
-2 중 첫 번째와 일치해야합니다n
-2 출력 열. 나머지 출력 열에는의 마지막 열 유형이 있어야합니다.source_sql
Query의 결과, 그리고에 줄이있는 것만 큼 많은 것들이 있어야합니다Category_SQL
쿼리 결과.
Crosstab
함수는 각 연속 입력 행 그룹에 대해 하나의 출력 행을 생성합니다.row_name
값. 출력row_name
칼럼과 함께“추가”열은 그룹의 첫 번째 행에서 복사됩니다. 출력value
열은로 채워져 있습니다.value
일치하는 행의 필드카테고리
값. 행 인 경우카테고리
Category_SQL
쿼리, ITSvalue
무시됩니다. 그룹의 입력 행에 일치하는 범주가없는 출력 열에는 널로 채워집니다.
실제로source_sql
쿼리는 항상 지정해야합니다주문별 주문
동일 한 값을 확인하려면row_name
함께 모입니다. 그러나 그룹 내에서 카테고리를 주문하는 것은 중요하지 않습니다. 또한의 순서가 확실합니다.Category_SQL
쿼리의 출력은 지정된 출력 열 순서와 일치합니다.
다음은 다음과 같은 두 가지 예입니다.
테이블 판매 생성 (Year Int, Month Int, Qty int); 판매 값에 삽입 (2007, 1, 1000); 판매 가치에 삽입 (2007, 2, 1500); 판매 값에 삽입 (2007, 7, 500); 판매 가치에 삽입 (2007, 11, 1500); 판매 값에 삽입 (2007, 12, 2000); 판매 값에 삽입 (2008, 1, 1000); Crosstab에서 *를 선택하십시오 ( '선택 연도, 월, 영업 주문에서 1 ~ 1', 1 ', 'generate_series (1,12) m에서 m을 선택하십시오' ) 처럼 ( int, "Jan"int, "Feb"int, "mar"int, "apr"int, "5 월"int, "Jun"int, "7 월"int, "8 월"int, "Sep"int, "OCT"int, "11 월"int, "12 월"int ); 해 | Jan | 2 월 | 3 월 | 4 월 | 5 월 | 6 월 | 7 월 | 8 월 | 9 월 | 10 월 | 11 월 | 12 월 ------+------+------+-----+-----+-----+-----+-----+-----+-----+------+------- 2007 | 1000 | 1500 | | | | | 500 | | | | 1500 | 2000 2008 | 1000 | | | | | | | | | | | (2 줄)
테이블 CTH 만들기 (ROWID TEXT, ROWDT 타임 스탬프, 속성 토토 캔, val 토토 캔); CTH 값에 삽입 ( 'test1', '01 2003 년 3 월 1 일', '온도', '42'); CTH 값에 삽입 ( 'test1', '01 2003 년 3 월 1 일', 'test_result', 'pass'); CTH 값에 삽입 ( 'test1', '01 2003 년 3 월 1 일', '볼트', '2.6987'); CTH 값에 삽입 ( 'test2', '02 2003 년 3 월 2 일', '온도', '53'); CTH 값에 삽입 ( 'test2', '2003 년 3 월 2 일', 'test_result', 'fail'); CTH 값에 삽입 ( 'test2', '02 2003 년 3 월 2 일', 'test_startDate', '01 2003 년 3 월 1 일'); Cth 값에 삽입 ( 'test2', '02 2003 년 3 월 2 일', '볼트', '3.1234'); Crosstab에서 *를 선택하십시오 ( 'select rowid, rowdt, attribute, val wrom cth order x 1', 'Cth Order에서 1 x 1 씩 고유 한 속성을 선택하십시오' )) 처럼 ( rowid 토토 캔, Rowdt 타임 스탬프, 온도 int4, test_result 토토 캔, test_startdate timestamp, 볼트 플로트 8 ); Rowid | Rowdt | 온도 | test_result | test_startdate | 볼트 -------+-------------------------------------------------------------------------------------------------- test1 | 2003 년 3 월 1 일 00:00:00 | 42 | 패스 | | 2.6987 test2 | 2003 년 3 월 02 일 00:00:00 | 53 | 실패 | 2003 년 3 월 1 일 00:00:00 | 3.1234 (2 줄)
각 쿼리에서 결과 열 이름과 유형을 쓰지 않도록 사전 정의 된 함수를 만들 수 있습니다. 이전 섹션의 예를 참조하십시오. 이 형태의 기본 C 함수Crosstab
Crosstab_hash
.
Connectby
Connectby (토토 캔 relname, 토토 캔 keyid_fld, 토토 캔 parent_keyid_fld [, text orderby_fld], text start_with, int max_depth [, text branch_delim])
theConnectby
함수는 테이블에 저장된 계층 적 데이터의 표시를 생성합니다. 테이블에는 행을 고유하게 식별하는 키 필드와 각 행의 부모 (있는 경우)를 참조하는 부모 키 필드가 있어야합니다.Connectby
어떤 행에서 하강하는 서브 트리를 표시 할 수 있습니다.
테이블 F.32매개 변수를 설명합니다.
표 F.32. Connectby
매개 변수
매개 변수 | 설명 |
---|---|
Relname |
소스 관계의 이름 |
keyid_fld |
키 필드의 이름 |
parent_keyid_fld |
부모 키 필드의 이름 |
Orderby_fld |
(선택 사항)에 의해 형제 자매를 주문할 필드 이름 |
start_with |
시작할 행의 키 값 |
max_depth |
하강하는 최대 깊이 또는 무제한 깊이의 경우 0 |
BRANCE_DELIM |
지점 출력 (선택 사항)으로 키를 분리하려면 문자열 |
키 및 부모 키 필드는 모든 데이터 유형 일 수 있지만 동일한 유형이어야합니다.start_with
값은 키 필드의 유형에 관계없이 토토 캔 문자열로 입력해야합니다.
theConnectby
함수는 반환으로 선언 됨Setof Record
, 출력 열의 실제 이름과 유형은에 정의되어야합니다.From
전화 조항select
진술, 예 :
select * from Connectby ( 'Connectby_tree', 'keyid', 'parent_keyid', 'pos', 'row2', 0, '~')). as t (keyid text, parent_keyid 토토 캔, 레벨 int, 분기 토토 캔, pos int);
처음 두 출력 열은 현재 행 키와 부모 행 키에 사용됩니다. 그들은 테이블의 키 필드의 유형과 일치해야합니다. 세 번째 출력 열은 트리의 깊이이며 유형이어야합니다정수
. aBRANCE_DELIM
매개 변수가 제공되었고, 다음 출력 열은 분기 디스플레이이며 유형이어야합니다토토 캔
. 마지막으로,Orderby_fld
매개 변수가 제공되었고, 마지막 출력 열은 일련 번호이며, 유형이어야합니다Integer
.
the“Branch”출력 열에는 현재 행에 도달하기 위해 촬영 한 키의 경로가 표시됩니다. 키는 지정된에 의해 분리됩니다BRANCE_DELIM
문자열. 분기 디스플레이가 원하지 않으면 두 가지를 모두 생략하십시오BRANCE_DELIM
출력 열 목록의 매개 변수 및 분기 열.
같은 부모의 형제 자매 주문이 중요하다면Orderby_fld
형제 자매를 주문할 필드를 지정하는 매개 변수. 이 필드는 정렬 가능한 데이터 유형 일 수 있습니다. 출력 열 목록에는 최종 정수 직렬 번호 열이 포함되어야합니다.Orderby_fld
지정되어 있습니다.
테이블 및 필드 이름을 나타내는 매개 변수는 as-as-as-as-as입니다.Connectby
내부적으로 생성됩니다. 따라서 이름이 혼합 된 경우 또는 특수 문자를 포함하는 경우 이중 인용문을 포함하십시오. 테이블 이름을 스키마 자격으로 평가해야 할 수도 있습니다.
대형 테이블에서는 부모 키 필드에 색인이 없으면 성능이 저하됩니다.
이 중요합니다.BRANCE_DELIM
문자열이 키 값에 나타나지 않으면Connectby
무한 회수 오류를 잘못보고 할 수 있습니다. ifBRANCE_DELIM
제공되지 않음, 기본값~
재귀 탐지 목적으로 사용됩니다.
여기 예입니다.
테이블 생성 connectby_tree (keyid text, parent_keyid text, pos int); Connectby_tree 값에 삽입 ( 'Row1', Null, 0); Connectby_tree 값에 삽입 ( 'Row2', 'Row1', 0); Connectby_tree 값에 삽입 ( 'Row3', 'Row1', 0); Connectby_tree 값에 삽입 ( 'Row4', 'Row2', 1); Connectby_tree 값에 삽입 ( 'Row5', 'Row2', 0); Connectby_tree 값에 삽입 ( 'Row6', 'Row4', 0); Connectby_tree 값에 삽입 ( 'Row7', 'Row3', 0); Connectby_tree 값에 삽입 ( 'Row8', 'Row6', 0); Connectby_tree 값에 삽입 ( 'Row9', 'Row5', 0); - Orderby_fld가없는 분기 (결과 순서는 보장되지 않음) 선택 *에서 Connectby ( 'Connectby_tree', 'keyid', 'parent_keyid', 'row2', 0, '~')를 선택하십시오. t (keyid text, parent_keyid 토토 캔, 레벨 int, branch 토토 캔); keyid | parent_keyid | 레벨 | 나뭇가지 -------+---------------+-------+-------------------- Row2 | | 0 | Row2 Row4 | Row2 | 1 | Row2 ~ Row4 Row6 | Row4 | 2 | Row2 ~ Row4 ~ Row6 Row8 | Row6 | 3 | row2 ~ row4 ~ row6 ~ row8 Row5 | Row2 | 1 | Row2 ~ Row5 Row9 | Row5 | 2 | Row2 ~ row5 ~ row9 (6 줄) - 분기 없음, Orderby_fld없이 (결과 순서는 보장되지 않습니다) 선택 *에서 Connectby ( 'Connectby_tree', 'keyid', 'parent_keyid', 'row2', 0) t (keyid text, parent_keyid 토토 캔, 레벨 int); keyid | parent_keyid | 수준 -------+-------------+------- Row2 | | 0 Row4 | Row2 | 1 Row6 | Row4 | 2 Row8 | Row6 | 3 Row5 | Row2 | 1 Row9 | Row5 | 2 (6 줄) - Orderby_fld와 함께 Branch (Row5가 Row4 앞에 오는 것을 주목하십시오) Connectby에서 *를 선택하십시오 ( 'Connectby_tree', 'keyid', 'parent_keyid', 'pos', 'row2', 0, '~')) t (keyid text, parent_keyid 토토 캔, 레벨 int, 분기 토토 캔, pos int); keyid | parent_keyid | 레벨 | 지점 | POS -------+----------------------------------------------------- Row2 | | 0 | Row2 | 1 Row5 | Row2 | 1 | Row2 ~ Row5 | 2 Row9 | Row5 | 2 | Row2 ~ Row5 ~ Row9 | 3 Row4 | Row2 | 1 | Row2 ~ Row4 | 4 Row6 | Row4 | 2 | Row2 ~ Row4 ~ Row6 | 5 Row8 | Row6 | 3 | row2 ~ row4 ~ row6 ~ row8 | 6 (6 줄) - 지점없이, Orderby_fld (Row5가 Row4 전에 오는 것을 주목) 선택 *에서 Connectby ( 'Connectby_tree', 'keyid', 'parent_keyid', 'pos', 'row2', 0) t (keyid text, parent_keyid 토토 캔, 레벨 int, pos int); keyid | parent_keyid | 레벨 | POS -------+-------------+-------+----- Row2 | | 0 | 1 Row5 | Row2 | 1 | 2 Row9 | Row5 | 2 | 3 Row4 | Row2 | 1 | 4 Row6 | Row4 | 2 | 5 Row8 | Row6 | 3 | 6 (6 줄)
Joe Conway
문서에 올바르지 않은 내용이 있으면 일치하지 않습니다. 특정 기능에 대한 귀하의 경험 또는 추가 설명이 필요합니다. 사용이 양식문서 문제를보고하려면