토토 베이 유형은 일부 요소 유형(토토 베이라고 함)의 값 토토 베이를 나타내는 데이터 유형입니다.하위유형). 예를 들어, 토토 베이는타임스탬프회의실이 예약된 시간 토토 베이를 나타내는 데 사용될 수 있습니다. 이 경우 데이터 유형은tsrange(줄임말“타임스탬프 범위”) 및타임스탬프은 하위 유형입니다. 하위 유형에는 요소 값이 값 토토 베이 내에 있는지, 앞인지, 뒤에 있는지 잘 정의되도록 전체 순서가 있어야 합니다.
토토 베이 유형은 단일 토토 베이 값에서 많은 요소 값을 나타내고, 토토 베이가 겹치는 등의 개념을 명확하게 표현할 수 있기 때문에 유용합니다. 일정 관리를 위해 시간과 날짜 토토 베이를 사용하는 것이 가장 명확한 예입니다. 하지만 가격 토토 베이, 기기의 측정 토토 베이 등도 유용할 수 있습니다.
모든 토토 베이 유형에는 해당하는 다중 토토 베이 유형이 있습니다. 다중 토토 베이는 연속되지 않고 비어 있지 않으며 Null이 아닌 토토 베이의 순서가 지정된 목록입니다. 대부분의 토토 베이 연산자는 다중 토토 베이에서도 작동하며 고유한 몇 가지 기능을 가지고 있습니다.
PostgreSQL에는 다음과 같은 기본 제공 범위 유형이 제공됩니다.
int4range— 토토 베이정수, int4multirange— 해당 다중 토토 베이
int8range— 토토 베이비긴트, int8multirange— 해당 다중 토토 베이
숫자 토토 베이— 토토 베이숫자, nummultirange— 해당 다중 토토 베이
tsrange— 토토 베이시간대가 없는 타임스탬프, tsmultirange— 해당 다중 토토 베이
tstzrange— 토토 베이시간대가 포함된 타임스탬프, tstzmultirange— 해당 다중 토토 베이
날짜 토토 베이— 토토 베이날짜, datemultirange— 해당 다중 토토 베이
또한, 당신은 자신만의 토토 베이 유형을 정의할 수 있습니다. 참조유형 생성더 많은 정보를 원하시면.
CREATE TABLE 예약(방 int, tsrange 중);
예약 값에 삽입
(1108, '[2010-01-01 14:30, 2010-01-01 15:30)');
-- 격리
SELECT int4range(10, 20) @ 3;
-- 중복
SELECT 숫자 토토 베이(11.1, 22.2) && 숫자 토토 베이(20.0, 30.0);
-- 상한 추출
SELECT upper(int8범위(15, 25));
-- 교차점을 계산합니다.
SELECT int4범위(10, 20) * int4범위(15, 25);
-- 범위가 비어 있습니까?
SELECT isempty(숫자 토토 베이(1, 5));
비어 있지 않은 모든 토토 베이에는 하한과 상한의 두 가지 경계가 있습니다. 이 값 사이의 모든 점이 토토 베이에 포함됩니다. 포괄적 경계란 경계점 자체도 토토 베이에 포함되는 것을 의미하고, 배타적 경계는 경계점 자체가 토토 베이에 포함되지 않음을 의미합니다.
범위의 텍스트 형식에서 하한값은 다음과 같이 표시됩니다.“[”배타적인 하한은 다음과 같이 표현됩니다.“(”. 마찬가지로, 포괄적인 상한은 다음과 같이 표현됩니다.“]”, 배타적인 상한은 다음과 같이 표현됩니다.“)”. (참조섹션 8.17.5자세한 내용은.)
함수lower_inc그리고upper_inc각각 토토 베이 값의 하한 및 상한의 포함성을 테스트합니다.
토토 베이의 하한은 생략될 수 있습니다. 이는 상한보다 작은 모든 값이 토토 베이에 포함된다는 의미입니다. 예:(,3]. 마찬가지로, 토토 베이의 상한을 생략하면 하한보다 큰 모든 값이 토토 베이에 포함됩니다. 하한과 상한을 모두 생략하면 요소 유형의 모든 값이 토토 베이에 속하는 것으로 간주됩니다. 누락된 경계를 포함으로 지정하면 자동으로 제외로 변환됩니다. 예:[,]다음으로 변환됨(,). 이러한 누락된 값을 +/-무한대라고 생각할 수 있지만 이는 특수 토토 베이 유형 값이며 모든 토토 베이 요소 유형의 +/-무한대 값을 벗어나는 것으로 간주됩니다.
다음 개념을 가진 요소 유형“무한대”이를 명시적인 바인딩 값으로 사용할 수 있습니다. 예를 들어 타임스탬프 범위의 경우,[오늘,무한대)특수 제외타임스탬프값무한대, 그동안[오늘,무한대]그것을 포함하세요.[오늘,)그리고[오늘,].
함수lower_inf그리고upper_inf토토 베이의 무한 하한 및 상한을 각각 테스트합니다.
범위 값에 대한 입력은 다음 패턴 중 하나를 따라야 합니다.
(하한값,상한) (하한값,상한] [하한값,상한) [하한값,상한] 비어 있음
괄호 또는 대괄호는 이전에 설명한 대로 하한 및 상한이 배타적인지 포함인지를 나타냅니다. 최종 패턴은 다음과 같습니다.비어 있음, 이는 빈 토토 베이(점을 포함하지 않는 토토 베이)를 나타냅니다.
그하한값하위 유형에 대한 유효한 입력인 문자열이거나 하한이 없음을 나타내기 위해 비어 있을 수 있습니다. 마찬가지로,상한하위 유형에 대한 유효한 입력인 문자열이거나 상한이 없음을 나타내기 위해 비어 있을 수 있습니다.
각 바운드 값은 다음을 사용하여 인용할 수 있습니다."(큰따옴표) 문자. 이는 바인딩된 값에 괄호, 대괄호, 쉼표, 큰따옴표 또는 백슬래시가 포함된 경우 필요합니다. 그렇지 않으면 이러한 문자가 범위 구문의 일부로 간주되기 때문입니다. 따옴표로 묶인 값에 큰따옴표나 백슬래시를 넣으려면 그 앞에 백슬래시를 놓으십시오. (또한 큰따옴표로 묶인 값 내의 큰따옴표 쌍은 SQL 리터럴 문자열의 작은따옴표 규칙과 유사하게 큰따옴표 문자를 나타내는 데 사용됩니다.) 또는 따옴표를 피하고 백슬래시 이스케이프를 사용하여 범위 구문으로 간주되는 모든 데이터 문자를 보호할 수 있습니다. 또한 빈 문자열인 바인딩된 값을 쓰려면 다음과 같이 씁니다."", 아무것도 쓰지 않는다는 것은 무한한 경계를 의미하기 때문입니다.
범위 값 앞뒤에 공백이 허용되지만 괄호나 대괄호 사이의 공백은 하한 또는 상한 값의 일부로 간주됩니다. (요소 유형에 따라 중요할 수도 있고 중요하지 않을 수도 있습니다.)
이러한 규칙은 복합 유형 리터럴에 필드 값을 쓰는 규칙과 매우 유사합니다. 보다섹션 8.16.6추가 설명을 원하시면.
예:
-- 3개 포함, 7개 포함 안 함, 사이의 모든 점 포함
SELECT '[3,7)'::int4range;
-- 3이나 7을 포함하지 않지만 그 사이의 모든 점을 포함합니다.
SELECT '(3,7)'::int4범위;
-- 단일 지점만 포함 4
SELECT '[4,4]'::int4범위;
-- 포인트가 포함되지 않습니다('비어 있음'으로 정규화됨).
선택 '[4,4)'::int4range;
다중 토토 베이에 대한 입력은 중괄호({그리고}) 쉼표로 구분된 0개 이상의 유효한 토토 베이를 포함합니다. 대괄호와 쉼표 주위에는 공백이 허용됩니다. 다중 토토 베이가 훨씬 더 간단하기는 하지만 이는 배열 구문을 연상시키기 위한 것입니다. 즉, 차원이 하나 뿐이고 내용을 인용할 필요가 없습니다. (그러나 해당 토토 베이의 경계는 위와 같이 인용될 수 있습니다.)
예:
SELECT ''::int4multirange; SELECT '[3,7)'::int4다중 범위; SELECT '[3,7), [8,9)'::int4다중 범위;
각 범위 유형에는 범위 유형과 동일한 이름을 가진 생성자 함수가 있습니다. 생성자 함수를 사용하면 범위 리터럴 상수를 작성하는 것보다 더 편리한 경우가 많습니다. 바인딩된 값을 추가로 인용할 필요가 없기 때문입니다. 생성자 함수는 2개 또는 3개의 인수를 허용합니다. 2인수 형식은 표준 형식(하한 포함, 상한 제외)으로 범위를 구성하는 반면, 3인수 형식은 세 번째 인수로 지정된 형식의 범위로 범위를 구성합니다. 세 번째 인수는 문자열 중 하나여야 합니다.“()”, “(]”, “[)”또는“[]”. 예를 들면:
-- 전체 형식은 하한, 상한 및 이를 나타내는 텍스트 인수입니다. -- 범위의 포괄성/배타성. SELECT 숫자 토토 베이(1.0, 14.0, '(]'); -- 세 번째 인수가 생략되면 '[)'로 간주됩니다. SELECT 숫자범위(1.0, 14.0); -- 여기서는 '(]'를 지정했지만 표시되는 값은 다음과 같이 변환됩니다. -- int8range가 이산 범위 유형이므로 정식 형식입니다(아래 참조). SELECT int8range(1, 14, '(]'); -- 두 경계 중 하나에 NULL을 사용하면 해당 측면의 범위가 제한되지 않습니다. SELECT 숫자 토토 베이(NULL, 2.2);
각 범위 유형에는 다중 범위 유형과 동일한 이름을 가진 다중 범위 생성자가 있습니다. 생성자 함수는 해당 유형의 모든 범위인 0개 이상의 인수를 사용합니다. 예를 들면:
SELECT nummultirange(); SELECT nummultirange(숫자 토토 베이(1.0, 14.0)); SELECT nummultirange(numrange(1.0, 14.0), numrange(20.0, 25.0));
불연속 토토 베이는 요소 유형이 잘 정의된 토토 베이입니다.“단계”, 예를 들어정수또는날짜. 이러한 유형에서는 두 요소 사이에 유효한 값이 없을 때 두 요소가 인접해 있다고 말할 수 있습니다. 이는 주어진 두 값 사이에서 다른 요소 값을 식별하는 것이 항상(또는 거의 항상) 가능한 연속 범위와 대조됩니다. 예를 들어,숫자유형은 토토 베이 초과와 마찬가지로 연속형입니다.타임스탬프. (그렇지만타임스탬프정확도가 제한되어 이론적으로 이산형으로 처리될 수 있습니다. 일반적으로 단계 크기는 관심 대상이 아니므로 연속형으로 간주하는 것이 좋습니다.)
이산 토토 베이 유형에 대해 생각하는 또 다른 방법은 a에 대한 명확한 아이디어가 있다는 것입니다.“다음”또는“이전”각 요소 값에 대한 값입니다. 이를 알면 원래 주어진 값 대신 다음 또는 이전 요소 값을 선택하여 범위 경계의 포괄적 표현과 배타적 표현 사이를 변환할 수 있습니다. 예를 들어 정수 범위 유형에서[4,8]그리고(3,9)동일한 값 세트를 나타냅니다. 그러나 숫자 이상의 범위에서는 그렇지 않습니다.
불연속 범위 유형에는 다음이 있어야 합니다.정규화25640_26088
내장 토토 베이 유형int4range, int8range및날짜 토토 베이모두 하한을 포함하고 상한을 제외하는 표준 형식을 사용합니다. 즉,[). 그러나 사용자 정의 토토 베이 유형은 다른 규칙을 사용할 수 있습니다.
사용자는 자신의 토토 베이 유형을 정의할 수 있습니다. 이렇게 하는 가장 일반적인 이유는 내장된 토토 베이 유형 중에서 제공되지 않는 하위 유형에 대한 토토 베이를 사용하기 위한 것입니다. 예를 들어 하위 유형의 새로운 토토 베이 유형을 정의하려면float8:
CREATE TYPE floatrange AS RANGE(
하위 유형 = float8,
subtype_diff = float8mi
);
SELECT '[1.234, 5.678]'::floatrange;
왜냐하면float8의미가 없습니다“단계”, 이 예에서는 정규화 함수를 정의하지 않습니다.
자신만의 토토 베이를 정의하면 해당하는 다중 토토 베이 유형이 자동으로 생성됩니다.
자신만의 범위 유형을 정의하면 사용할 다른 하위 유형 B-트리 연산자 클래스 또는 데이터 정렬을 지정할 수 있으므로 주어진 범위에 속하는 값을 결정하는 정렬 순서를 변경할 수 있습니다.
하위 유형이 연속 값이 아닌 불연속 값을 갖는 것으로 간주되는 경우,유형 생성명령은 다음을 지정해야 합니다.표준함수. 정규화 함수는 입력 범위 값을 사용하며 범위와 형식이 다를 수 있는 동등한 범위 값을 반환해야 합니다. 동일한 값 집합을 나타내는 두 범위(예: 정수 범위)에 대한 표준 출력[1, 7]그리고[1, 8)은 동일해야 합니다. 형식이 서로 다른 두 개의 동등한 값이 항상 동일한 형식의 동일한 값에 매핑되는 한 어떤 표현을 표준 표현으로 선택하는지는 중요하지 않습니다. 포함/배타 범위 형식을 조정하는 것 외에도 원하는 단계 크기가 하위 유형이 저장할 수 있는 것보다 큰 경우 정규화 함수는 경계 값을 반올림할 수 있습니다. 예를 들어 범위 유형은 다음과 같습니다.타임스탬프1시간의 단계 크기를 갖도록 정의할 수 있으며, 이 경우 정규화 함수는 1시간의 배수가 아닌 경계를 반올림하거나 대신 오류를 발생시켜야 합니다.
또한 GiST 또는 SP-GiST 인덱스와 함께 사용되는 모든 범위 유형은 하위 유형 차이를 정의해야 합니다. 또는subtype_diff, 함수. (인덱스는 없이도 계속 작동합니다.subtype_diff, 그러나 차이 함수가 제공되는 경우보다 효율성이 상당히 떨어질 가능성이 높습니다.) 하위 유형 차이 함수는 하위 유형의 두 입력 값을 가져와 그 차이를 반환합니다(예:X마이너스Y)는로 표현됩니다.float8값. 위의 예에서 함수는float8mi정규의 기초가 되는float8빼기 연산자를 사용할 수 있습니다. 그러나 다른 하위 유형의 경우 일부 유형 변환이 필요합니다. 숫자로 차이를 표현하는 방법에 대한 창의적인 생각도 필요할 수 있습니다. 가능한 한 최대로,subtype_diff함수는 선택한 연산자 클래스 및 데이터 정렬에 따른 정렬 순서와 일치해야 합니다. 즉, 정렬 순서에 따라 첫 번째 인수가 두 번째 인수보다 클 때마다 그 결과는 양수여야 합니다.
a의 덜 단순화된 예subtype_diff함수는:
CREATE FUNCTION time_subtype_diff(x 시간, y 시간) float8 AS를 반환합니다.
'SELECT EXTRACT(EPOCH FROM (x - y))' LANGUAGE sql STRICT IMMUTABLE;
TYPE 시간 범위를 RANGE(
하위 유형 = 시간,
subtype_diff = time_subtype_diff
);
'[11:10, 23:00]'::시간 범위;를 선택하세요.
참조유형 작성범위 유형 생성에 대한 자세한 내용을 확인하세요.
GiST 및 SP-GiST 인덱스는 토토 베이 유형의 테이블 열에 대해 생성될 수 있습니다. 다중 토토 베이 유형의 테이블 열에 대해서도 GiST 인덱스를 생성할 수 있습니다. 예를 들어, GiST 인덱스를 생성하려면:
GIST를 사용하여 예약에 대한 INDEX booking_idx 생성(중);
범위의 GiST 또는 SP-GiST 색인은 다음 범위 연산자와 관련된 쿼리를 가속화할 수 있습니다.=, &&, <@, @, <<, , -|-, &<및&. 다중 토토 베이의 GiST 인덱스는 동일한 다중 토토 베이 연산자 세트와 관련된 쿼리를 가속화할 수 있습니다. 토토 베이에 대한 GiST 인덱스와 다중 토토 베이에 대한 GiST 인덱스는 이에 따라 교차 유형 토토 베이에서 다중 토토 베이 및 다중 토토 베이에서 토토 베이 연산자와 관련된 쿼리를 가속화할 수도 있습니다.&&, <@, @, <<, , -|-, &<및&. 참조표 9.58더 많은 정보를 원하시면.
또한 토토 베이 유형의 테이블 열에 대해 B-트리 및 해시 인덱스를 생성할 수 있습니다. 이러한 인덱스 유형의 경우 기본적으로 유일하게 유용한 토토 베이 연산은 동일성입니다. 토토 베이 값에 대해 정의된 B-트리 정렬 순서가 있습니다.<그리고연산자이지만 순서는 다소 임의적이며 일반적으로 실제 세계에서는 유용하지 않습니다. 범위 유형의 B-트리 및 해시 지원은 주로 실제 인덱스를 생성하는 대신 쿼리에서 내부적으로 정렬 및 해싱을 허용하기 위한 것입니다.
그동안고유은 스칼라 값에 대한 자연스러운 제약 조건이며 일반적으로 범위 유형에는 적합하지 않습니다. 대신, 제외 제약조건이 더 적합한 경우가 많습니다(참조테이블 생성 ... 제약 조건 ... 제외). 제외 제약 조건을 사용하면 다음과 같은 제약 조건을 지정할 수 있습니다.“중복되지 않음”범위 유형에 대해. 예를 들면:
CREATE TABLE 예약(
tsrange 동안,
GIST를 사용하여 제외(WITH && 중)
);
이 제약 조건은 테이블에 동시에 존재하는 값이 겹치는 것을 방지합니다.
예약 값에 삽입
('[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이 설치되면 회의실 번호가 동일한 경우에만 다음 제약 조건이 겹치는 범위를 거부합니다.
확장 프로그램 생성 btree_gist;
CREATE TABLE room_reservation (
방 텍스트,
tsrange 동안,
GIST를 사용하여 제외(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