젠 토토 유형은 일부 요소 유형의 값 젠 토토를 나타내는 데이터 유형입니다 (젠 토토라고 함)하위 유형). 예를 들어, 젠 토토타임 스탬프
회의실이 예약되어있는 시간의 젠 토토를 나타내는 데 사용될 수 있습니다. 이 경우 데이터 유형은입니다.tsrange
(짧은“타임 스탬프 범위”) 및타임 스탬프
하위 유형입니다. 하위 유형은 요소 값이 값 범위 내에 있는지 또는 그 후에 요소 값이 잘 정의되도록 총 순서를 가져야합니다.
젠 토토 유형은 단일 젠 토토 값의 많은 요소 값을 나타내고 겹치는 젠 토토와 같은 개념을 명확하게 표현할 수 있기 때문에 유용합니다. 예약 목적으로 시간과 날짜 젠 토토를 사용하는 것이 가장 분명한 예입니다. 그러나 가격대, 측정 젠 토토는 기기에서 얻을 수 있습니다.
모든 젠 토토 유형에는 해당 멀티 랜지 유형이 있습니다. 멀티 랜지는 논쟁의 여지가없고 비어 있지 않은 비 널 젠 토토의 주문 목록입니다. 대부분의 레인지 운영자는 멀티 랜더스에서 작동하며 자체 기능이 몇 가지 있습니다.
PostgreSQL은 다음과 같은 내장 젠 토토 유형과 함께 제공됩니다 :
int4Range
- 젠 토토정수
, int4multirange
- 해당 멀티 랜지
int8Range
- 젠 토토bigint
, int8multirange
- 해당 멀티 랜지
NumRange
- 젠 토토숫자
, Nummultirange
- 해당 멀티 랜지
TSRANGE
- 젠 토토시간대가없는 타임 스탬프
, Tsmultirange
- 해당 멀티 랜지
TSTZRANGE
- 젠 토토시간대가있는 타임 스탬프
, tstzmultirange
- 해당 멀티 랜지
Daterange
- 젠 토토날짜
, datemultirange
- 해당 멀티 랜지
또한 자신의 젠 토토 유형을 정의 할 수 있습니다. 보다유형 만들기자세한 내용은
테이블 예약 생성 (TsRange 중 객실 int); 예약 값에 삽입하십시오 (1108, '[2010-01-01 14:30, 2010-01-01 15:30)'); -- 방지 int4Range (10, 20) @ 3을 선택하십시오. - 겹침 NumRange (11.1, 22.2) && NumRange (20.0, 30.0)를 선택하십시오. - 상한을 추출하십시오 상단 (int8Range (15, 25))를 선택하십시오. - 교차로를 계산하십시오 int4Range (10, 20) * int4Range (15, 25)를 선택하십시오. - 젠 토토가 비어 있습니까? select isempty (numrange (1, 5));
모든 비어 있지 않은 젠 토토에는 하한과 상한의 두 젠 토토가 있습니다. 이 값 사이의 모든 지점은 젠 토토에 포함됩니다. 포괄적 인 경계는 경계 지점 자체가 젠 토토에도 포함되어 있음을 의미하는 반면, 독점 경계는 경계 지점이 젠 토토에 포함되어 있지 않음을 의미합니다.
젠 토토의 텍스트 형태에서 포괄적 인 하한은에 표시됩니다.“[
”독점적 인 하한이 표시되는 동안“(
”. 마찬가지로 포괄적 인 상한은로 표시됩니다.“]
”, 독점 상한은에 의해 표현됩니다.“)
”. (보다섹션 8.17.5자세한 내용은.)
함수lower_inc
and어퍼_inc
젠 토토 값의 하부 및 상한의 포괄 성을 테스트합니다.
젠 토토의 하한을 생략 할 수 있습니다. 즉, 상한보다 적은 모든 값이 젠 토토에 포함되어 있음을 의미합니다.(, 3]
. 마찬가지로, 젠 토토의 상한이 생략되면 하한보다 큰 모든 값이 젠 토토에 포함됩니다. 하부와 상한이 모두 생략되면 요소 유형의 모든 값이 젠 토토에있는 것으로 간주됩니다. 포괄적으로 누락 된 바운드를 지정하면 자동으로 독점적으로 변환됩니다 (예 :[,]
(,)
. 이러한 결 측값을 +/- 인피니티로 생각할 수는 있지만 특수 젠 토토 유형 값이며 모든 젠 토토 요소 유형의 +/- 인피니티 값으로 간주됩니다..
개념이있는 요소 유형“Infinity”명시 적 바운드 값으로 사용할 수 있습니다. 예를 들어 타임 스탬프 범위가있는[오늘, 인피니티)
스페셜 제외타임 스탬프
valueInfinity
, while[오늘, 인피니티]
포함하여[오늘,)
and[오늘,]
.
함수lower_inf
and어퍼 _inf
젠 토토의 무한 하부 및 상한을 테스트합니다.
젠 토토 값에 대한 입력은 다음 패턴 중 하나를 따라야합니다.
(하위 바운드
,상한
) (하위 바운드
,상한
] [하위 바운드
,상한
) [하위 바운드
,상한
] 비어 있는
괄호 또는 괄호는 앞에서 설명한 바와 같이 하부 및 상한이 배타적인지 또는 포괄적인지를 나타냅니다. 최종 패턴은빈
는 빈 젠 토토 (포인트가없는 젠 토토)를 나타냅니다.
the하위 바운드
하위 유형에 대한 유효한 입력 인 문자열이거나 하한을 나타내지 않기 위해 비어있을 수 있습니다. 비슷하게,상한
하위 유형에 대한 유효한 입력 인 문자열이거나 상한을 나타내지 않도록 비어있을 수 있습니다.
각 바운드 값을 사용하여 인용 할 수 있습니다"
(이중 인용) 문자. 바운드 값에 괄호 안, 괄호, 쉼표, 이중 인용문 또는 백 슬래시가 포함 된 경우에 필요합니다. 왜냐하면이 문자는 젠 토토 구문의 일부로 간주되기 때문입니다. 인용 된 바운드 값에 이중 견적 또는 백 슬래시를 넣으려면 백 슬래시로 우선합니다. (또한, 두 배가 인용 된 바운드 값 내의 이중 인용문 쌍은 SQL 리터럴 문자열의 단일 따옴표 규칙과 유사하게 이중 인용 문자를 나타내는 것으로 간주됩니다.) 또는 인용문을 피하고 백 슬래시 에스케이프를 사용하여 모든 데이터 문자를 구문으로 보호 할 수 있습니다. 또한 빈 문자열 인 바운드 값을 작성하려면 쓰기""
, 아무것도 쓰지 않기 때문에 무한한 경계를 의미합니다.
범위 값 전후에 공백이 허용되지만 괄호 나 브래킷 사이의 모든 공백은 하부 또는 상한 값의 일부로 간주됩니다. (요소 유형에 따라 중요하거나 중요하지 않을 수도 있습니다.)
이 규칙은 복합 유형 리터럴에서 필드 값을 작성하는 것과 매우 유사합니다. 보다섹션 8.16.6추가 논평은
예 :
- 3 포함, 7은 포함되지 않으며 그 사이의 모든 지점을 포함합니다. '[3,7)':: int4Range; - 3 또는 7이 포함되어 있지 않지만 그 사이에 모든 지점이 포함되어 있습니다. 선택 '(3,7)':: int4Range; - 단일 포인트 4 만 포함합니다 '[4,4]':: int4Range; - 포인트가 포함되지 않습니다 (그리고 '빈'으로 정규화됩니다) 선택 '[4,4)':: int4Range;
멀티 랜지의 입력은 곱슬 브래킷입니다 (and
) 쉼표로 분리 된 0 이상의 유효 젠 토토를 포함합니다. 뇌물과 쉼표 주변에는 흰색이 허용됩니다. 이것은 멀티 랜지가 훨씬 간단하지만 배열 구문을 연상시키기위한 것입니다. 그들은 단 하나의 차원이 있고 내용을 인용 할 필요가 없습니다. (그들의 젠 토토의 젠 토토는 위와 같이 인용 될 수 있습니다.)
예 :
선택 '':: int4multirange; '[3,7)':: int4multirange; 선택 '[3,7), [8,9)':: int4multirange;
각 범위 유형에는 범위 유형과 동일한 이름의 생성자 기능이 있습니다. 생성자 함수를 사용하는 것은 범위 문자가 상수를 작성하는 것보다 종종 더 편리합니다. 왜냐하면 경계 값의 추가 인용이 필요하지 않기 때문입니다. 생성자 함수는 2 ~ 3 개의 인수를 허용합니다. 두 가지 연계 형식은 표준 형태 (하한 포함, 상한 독점)로 범위를 구성하는 반면, 3- 연체 양식은 세 번째 인수에 의해 지정된 양식의 범위를 갖는 범위를 구성합니다. 세 번째 인수는 문자열 중 하나 여야합니다“()
”, “(]
”, “[)
”또는“[]
”. 예를 들어:
- 전체 형식은 : 하한, 상한 및 텍스트 인수를 나타냅니다. - 바운드의 포괄 성/독점 성. NumRange (1.0, 14.0, '(]')를 선택하십시오. - 세 번째 인수가 생략되면 '[)'가 가정됩니다. NumRange (1.0, 14.0)를 선택하십시오. - '(]'가 여기에 지정되어 있지만 표시에서는 값이 변환됩니다. -Canonical Form, Int8Range는 개별 범위 유형이므로 (아래 참조). int8Range (1, 14, '(]')를 선택하십시오. - 어느 한 바운드에 NULL을 사용하면 범위가 해당 측면에서 무한하게됩니다. NumRange (NULL, 2.2); 선택
각 범위 유형에는 멀티 랜지 유형과 동일한 이름의 멀티 랜지 생성자가 있습니다. 생성자 함수는 적절한 유형의 범위 인 0 이상의 인수를 취합니다. 예를 들어:
NumMultirange ()를 선택하십시오. Nummultirange (NumRange (1.0, 14.0))를 선택하십시오. Nummultirange (NumRange (1.0, 14.0), NumRange (20.0, 25.0)); 선택
개별 젠 토토는 요소 유형이 잘 정의 된 것입니다“Step”:Integer
또는날짜
. 이러한 유형에서는 두 가지 요소가 인접 해 있다고 말할 수 있습니다. 이것은 주어진 두 값 사이의 다른 요소 값을 항상 (또는 거의 항상) 식별 할 수있는 연속 범위와 대조됩니다. 예를 들어,의 범위숫자
유형은 젠 토토와 마찬가지로 연속적입니다타임 스탬프
. (일지라도타임 스탬프
정밀도가 제한되어 있으며 이론적으로 개별로 취급 될 수 있으므로 단계 크기가 일반적으로 관심이 없기 때문에 연속적으로 고려하는 것이 좋습니다.)
개별 젠 토토 유형에 대해 생각하는 또 다른 방법은 A에 대한 명확한 아이디어가 있다는 것입니다.“다음”또는“이전”각 요소 값에 대한 값. 이를 알면 원래 주어진 것 대신 다음 또는 이전 요소 값을 선택함으로써 범위 범위의 포용 적 표현과 독점적 표현을 변환 할 수 있습니다. 예를 들어 정수 범위 유형에서[4,8]
및(3,9)
동일한 값 세트를 나타냅니다. 그러나 이것은 숫자 이상의 범위에 적합하지 않을 것입니다.
개별 젠 토토 유형에 a가 있어야합니다.Canonicalization요소 유형의 원하는 단계 크기를 알고있는 함수. 정식화 함수는 범위 유형의 등가 값을 동일한 표현, 특히 일관되게 포용 적 또는 독점적 인 경계를 갖도록 변환하는 것으로 청구됩니다. 정식화 함수가 지정되지 않으면, 다른 형식의 범위는 현실에서 동일한 값 세트를 나타낼 수 있지만 항상 불평등 한 것으로 취급됩니다..
내장 젠 토토 유형int4Range
, int8Range
및Daterange
모두 하한을 포함하고 상한을 제외하는 표준 형태를 사용합니다. 즉,[)
. 그러나 사용자 정의 젠 토토 유형은 다른 규칙을 사용할 수 있습니다.
사용자는 자신의 범위 유형을 정의 할 수 있습니다. 이를 수행하는 가장 일반적인 이유는 내장 젠 토토 유형에 제공되지 않은 하위 유형에 대한 범위를 사용하기 때문입니다. 예를 들어, 새로운 범위 유형의 하위 유형을 정의하려면float8
:
범위로 FloatRange 유형 생성 ( 하위 유형 = float8, subtype_diff = float8mi ); '[1.234, 5.678]':: floatRange; 선택
왜냐하면float8
의미가 없음“Step”, 우리는이 예에서 표준화 함수를 정의하지 않습니다.
자신의 젠 토토를 정의 할 때 자동으로 해당 멀티 랜지 유형을 가져옵니다.
자신의 범위 유형을 정의하면 다른 하위 유형 B- 트리 연산자 클래스 또는 Collation을 사용할 수 있으므로 주어진 범위에 속하는 값을 결정하는 정렬 순서를 변경할 수 있습니다..
하위 유형이 연속 값이 아닌 이산을 갖는 것으로 간주되면유형 생성
명령을 지정해야합니다표준
함수. 정식화 함수는 입력 범위 값을 취하며 다른 범위와 형식을 가질 수있는 동등한 범위 값을 반환해야합니다. 동일한 값 세트, 예를 들어 정수 범위를 나타내는 두 가지 범위의 표준 출력[1, 7]
and[1, 8)
는 동일해야합니다. 형식이 다른 두 개의 동등한 값이 항상 동일한 형식으로 동일한 값에 매핑되는 한 어떤 표현을 정식으로 선택하는지는 중요하지 않습니다. 포괄적/독점 범위 형식을 조정하는 것 외에도, 원하는 단계 크기가 하위 유형이 저장할 수있는 것보다 더 큰 경우, 표준화 함수는 경계 값을 반올림 할 수 있습니다. 예를 들어, 범위 유형 오버타임 스탬프
1 시간의 단계 크기를 가질 수 있는데,이 경우 표준화 함수는 한 시간이되지 않은 경계를 마무리하거나 오류를 대신 대신 오류를 던져야합니다..
또한 GIST 또는 SP-GIST 인덱스와 함께 사용될 범위 유형은 하위 유형 차이를 정의해야합니다.subtype_diff
, 함수. (색인은 여전히 작동하지 않습니다subtype_diff
, 그러나 차이 함수가 제공되는 경우보다 훨씬 덜 효율적일 수 있습니다.) 하위 유형 차이 함수는 하위 유형의 두 입력 값을 취하고 차이를 반환합니다 (예 :.x
마이너스y
)으로 표시float8
값. 위의 예에서는 함수float8mi
정규의 기초float8
마이너스 작업자를 사용할 수 있습니다. 그러나 다른 하위 유형의 경우 일부 유형 변환이 필요합니다. 차이를 숫자로 표현하는 방법에 대한 창의적 생각도 필요할 수 있습니다. 가능한 가장 큰 정도,subtype_diff
함수는 선택한 운영자 클래스 및 콜라이트가 암시하는 정렬 순서와 일치해야합니다. 즉, 첫 번째 인수가 정렬 순서에 따라 두 번째 인수보다 클 때마다 결과가 긍정적이어야합니다.
덜 단순화되지 않은 예제subtype_diff
함수는 다음과 같습니다.
함수 생성 time_subtype_diff (x time, y time)는 float8을 반환합니다 '추출 (epoch from (x -y))'언어 SQL 엄격한 불변; 유형 타이머 랜지 생성 범위 (범위) 하위 유형 = 시간, subtype_diff = time_subtype_diff ); '[11:10, 23:00]':: Timerange;를 선택하십시오.
참조유형 만들기범위 유형 생성에 대한 자세한 정보.
젠 토토 유형의 테이블 열에 대해 GIST 및 SP-GIST 인덱스를 만들 수 있습니다. 멀티 랜지 유형의 테이블 열에 대해서도 GIST 인덱스를 만들 수도 있습니다. 예를 들어, GIST 인덱스를 만들려면 :
GIST를 사용하여 예약에서 인덱스 예약 _IDX 생성;
범위의 요지 또는 SP-Gist 인덱스는 이러한 범위 연산자와 관련된 쿼리를 가속화 할 수 있습니다.=
, &&
, <@
, @
, <<
, ,
-|-
, &<
및&
. 멀티 랜지의 GIST 지수는 동일한 멀티 랜지 연산자와 관련된 쿼리를 가속화 할 수 있습니다. 멀티 라인의 젠 토토 및 GIST 인덱스에 대한 GIST 인덱스는 이러한 크로스 타입 젠 토토와 관련된 쿼리를 멀티 랜지 및 멀티 랜지에서 젠 토토 운영자에게 해당하는 쿼리를 가속화 할 수 있습니다.&&
, <@
, @
, <<
, ,
-|-
, &<
및&
. 보다표 9.58자세한 내용은
또한 젠 토토 유형의 테이블 열에 대해 B- 트리 및 해시 인덱스를 만들 수 있습니다. 이러한 인덱스 유형의 경우 기본적으로 유용한 젠 토토 작업은 평등입니다. 젠 토토 값에 대해 정의 된 B- 트리 정렬 순서가 있으며 해당<
and운영자이지만 주문은 다소 임의적이며 일반적으로 실제 세계에서 유용하지 않습니다. Range Type 'B-Tree 및 Hash 지원은 주로 실제 인덱스 생성보다는 내부적으로 정렬 및 해싱을 허용하기위한 것입니다.
while고유 한
는 스칼라 값에 대한 자연스러운 제약 조건이며, 일반적으로 범위 유형에 부적합합니다. 대신, 제외 제약 조건이 종종 더 적합합니다 (참조테이블 작성 ... 제약 ... 제외). 제외 제약 조건은와 같은 제약 조건의 사양을 허용합니다.“비 겹치기”범위 유형에서. 예를 들어:
테이블 예약 생성 ( tsrange 동안 GIST 사용 (& A) 동안 제외 );
그 제약 조건은 동시에 테이블에 존재하는 겹치는 값을 방지합니다 :
예약 값에 삽입하십시오 ( '[2010-01-01 11:30, 2010-01-01 15:00)'); 삽입 0 1 예약 값에 삽입하십시오 ( '[2010-01-01 14:45, 2010-01-01 15:45)'); 오류 : 충돌 키 값은 제외 제약 조건 "Reservation_During_Excl"을 위반합니다. 세부 사항 : 키 (기간) = ([ "2010-01-01 14:45:00", "2010-01-01 15:45:00")) 충돌 기존 키 (기간) = ([ "2010-01-01 11:30:00", "2010-01-01 15:00:00")..
를 사용할 수 있습니다토토 핫 : 문서 :
일반 스칼라 데이터 유형에 대한 제외 제약 조건을 정의하기위한 확장 및 최대 유연성을 위해 젠 토토 제외와 결합 할 수 있습니다. 예를 들어, 이후btree_gist
설치되어 있으면 회의실 번호가 동일 한 경우에만 다음 제약 조건이 중첩 범위를 거부합니다.
확장 생성 btree_gist; 테이블 생성 room_reservation ( 방 텍스트, tsrange 동안 GIST 사용 (& with &에서 with =, with =, with with with with with) ); room_reservation 값에 삽입하십시오 ( '123a', '[2010-01-01 14:00, 2010-01-01 15:00)'); 삽입 0 1 room_reservation 값에 삽입하십시오 ( '123a', '[2010-01-01 14:30, 2010-01-01 15:30)'); 오류 : 충돌 키 값은 제외 제약 조건 "room_reservation_room_during_excl"을 위반합니다. 세부 사항 : 키 (객실, 동안) = (123a, [ "2010-01-01 14:30:00", "2010-01-01 15:30:00") 충돌 기존 키 (객실, 동안) = (123a, [ "2010-01-01 14:00:00", "2010-01-01 15:00:00")). room_reservation 값에 삽입하십시오 ( '123b', '[2010-01-01 14:30, 2010-01-01 15:30)'); 삽입 0 1