이 문서는 지원되지 않는 PostgreSQL 버전에 대한 것입니다.
다음에 대한 동일한 페이지를 보고 싶을 수도 있습니다.PostgreSQL : 문서 : 17 : 8.17. 토토 결과 유형버전 또는 위에 나열된 다른 지원 버전 중 하나를 사용하세요.

8.17. 범위 사설 토토

범위 사설 토토은 값의 범위를 나타내는 데이터 사설 토토입니다. 일부 요소 사설 토토(범위라고 함)하위 사설 토토). 예를 들어, 범위는타임스탬프시간 범위를 나타내는 데 사용될 수 있습니다. 회의실이 예약되어 있다고요. 이 경우 데이터 사설 토토은tsrange(줄임말"타임스탬프 범위") 및타임스탬프는 하위 사설 토토입니다. 하위 사설 토토에는 총계가 있어야 합니다. 요소 값이 안에 있는지 잘 정의되도록 순서를 정하세요. 값 범위 앞이나 뒤에 있습니다.

범위 유형은 많은 요소를 나타내기 때문에 유용합니다. 단일 범위 값의 값이며 다음과 같은 개념 때문에 겹치는 범위를 명확하게 표현할 수 있습니다. 시간의 활용과 예약 목적의 날짜 범위가 가장 명확한 예입니다. 하지만 가격 범위, 기기의 측정 범위 등 유용할 수도 있습니다.

8.17.1. 내장 범위 사설 토토

PostgreSQL에는 다음과 같은 기본 제공 범위 유형이 제공됩니다.

  • int4range— 범위정수

  • int8range— 범위비긴트

  • 숫자 범위— 범위숫자

  • tsrange— 범위시간대 없는 타임스탬프

  • tstzrange— 범위시간대가 포함된 타임스탬프

  • 날짜 범위— 범위날짜

또한 자신만의 범위 사설 토토을 정의할 수 있습니다. 참조사설 토토 생성더 많은 정보를 원하시면.

8.17.2. 예시

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));

참조테이블 9-45그리고표 9-46용 범위 사설 토토에 대한 연산자 및 함수의 전체 목록입니다.

8.17.3. 포괄적인 것과 독점적인 것 경계

비어 있지 않은 모든 범위에는 두 개의 경계가 있습니다. 하한 경계와 상한. 이 값 사이의 모든 점은 범위. 포괄적 경계는 경계 지점 자체가 다음과 같다는 것을 의미합니다. 범위에도 포함되지만 배타적 경계는 다음을 의미합니다. 경계점은 범위에 포함되지 않습니다.

범위의 텍스트 형식에서 포괄적인 하한은 다음과 같습니다. 으로 표현됨"["배타적인 하한은 다음과 같습니다. 으로 표현됨"(". 마찬가지로, 포괄적인 상한은 다음과 같습니다. 으로 표현됨"]", 배타적 상한은 다음과 같습니다. 으로 표현됨")". (참조섹션 8.17.5더 보기 세부 사항.)

함수lower_inc그리고upper_inc하위 및 하위의 포괄성을 테스트합니다. 범위 값의 상한입니다.

8.17.4. 무한(무제한) 범위

범위의 하한은 생략될 수 있습니다. 즉, 모든 상한보다 작은 포인트는 범위에 포함됩니다. 마찬가지로 범위의 상한이 생략되면 모든 하한보다 큰 포인트는 범위에 포함됩니다. 만약에 하한과 상한이 모두 생략되고 요소의 모든 값 사설 토토은 범위 내에 있는 것으로 간주됩니다.

이것은 하한이 다음과 같다고 생각하는 것과 같습니다."마이너스 무한대"또는 상한은"플러스 무한대"입니다. 하지만 참고하세요 이러한 무한 값은 결코 범위 요소의 값이 아닙니다. 사설 토토이며 범위에 포함될 수 없습니다. (그래서 그런 건 없어요. 포괄적인 무한 경계로 간주됩니다. 작성하려고 하면 자동으로 배타적 경계로 변환됩니다.)

또한 일부 요소 유형에는 다음과 같은 개념이 있습니다."무한대", 하지만 이는 지금까지의 또 다른 값일 뿐입니다. 범위 유형 메커니즘이 관련됩니다. 예를 들어 타임스탬프에서 범위,[오늘,]다음과 같은 의미입니다[오늘,). 하지만[오늘,무한대]다음과 다른 의미입니다[오늘,무한대)— 후자는 다음을 제외합니다. 특별타임스탬프무한대.

함수lower_inf그리고upper_inf무한 하한 및 상한에 대한 테스트 각각 범위입니다.

8.17.5. 범위 입력/출력

범위 값에 대한 입력은 다음 중 하나를 따라야 합니다. 패턴:

(하한값,상한)
(하한값,상한]
[하한값,상한)
[하한값,상한]
비어 있음

괄호 또는 대괄호는 하위 및 상위 여부를 나타냅니다. 이전에 설명한 대로 범위는 배타적이거나 포함적입니다. 공지사항 최종 패턴은 다음과 같습니다.비어있음, 빈 범위(점을 포함하지 않는 범위)를 나타냅니다.

하한값다음 중 하나일 수 있습니다. 하위 사설 토토에 대한 유효한 입력인 문자열 또는 아니요를 나타내는 비어 있음 하한. 마찬가지로,상한하위 사설 토토에 대한 유효한 입력인 문자열이거나 상한이 없음을 나타내려면 비어 있습니다.

각 바운드 값은 다음을 사용하여 인용할 수 있습니다."(큰따옴표) 문자. 이는 바인딩된 값인 경우에 필요합니다. 괄호, 대괄호, 쉼표, 큰따옴표 또는 백슬래시. 그렇지 않으면 이 문자는 다음과 같이 간주됩니다. 범위 구문의 일부입니다. 큰따옴표나 백슬래시를 넣으려면 따옴표로 묶인 경계 값 앞에는 백슬래시가 옵니다. (또한 한 쌍의 큰따옴표로 묶인 경계 값 내의 큰따옴표는 규칙과 유사하게 큰따옴표 문자를 나타냅니다. SQL 리터럴 문자열의 작은따옴표.) 또는 다음을 피할 수 있습니다. 모든 데이터 문자를 보호하려면 인용 부호를 사용하고 백슬래시 이스케이프를 사용하세요. 그렇지 않으면 범위 구문으로 간주됩니다. 또한, 글을 쓰려면 빈 문자열인 경계값, 쓰기"", 아무 것도 쓰지 않으면 무한을 의미하므로 바운드.

범위 값 앞뒤에 공백이 허용되지만 괄호나 대괄호 사이의 공백은 다음의 일부로 간주됩니다. 하한값 또는 상한값. (요소 유형에 따라 중요할 수도 있고 중요하지 않을 수도 있습니다.)

참고:이 규칙은 글쓰기 규칙과 매우 유사합니다. 복합 사설 토토 리터럴의 필드 값. 참조섹션 8.16.6용 추가 해설입니다.

예:

-- 3개 포함, 7개 포함 안 함, 사이의 모든 점 포함
SELECT '[3,7)'::int4range;

-- 3이나 7을 포함하지 않지만 그 사이의 모든 점을 포함합니다.
SELECT '(3,7)'::int4범위;

-- 단일 지점만 포함 4
SELECT '[4,4]'::int4범위;

-- 포인트가 포함되지 않습니다('비어 있음'으로 정규화됨).
SELECT '[4,4)'::int4range;

8.17.6. 범위 구성

각 범위 유형에는 다음과 같은 이름을 가진 생성자 함수가 있습니다. 범위 유형. 생성자 함수를 사용하는 것이 더 자주 발생합니다. 범위 리터럴 상수를 작성하는 것보다 편리합니다. 바인딩된 값을 추가로 인용해야 합니다. 생성자 함수는 2개 또는 3개의 인수를 허용합니다. 2인수 형식 표준 형식(하한 포함, 상한)으로 범위를 구성합니다. 바운드 독점), 세 개의 인수 형식은 범위를 구성합니다. 세 번째 인수로 지정된 형식의 범위를 사용합니다. 세 번째 인수는 문자열 중 하나여야 합니다."()", "(]", "[)"또는"[]". 예를 들면:

-- 전체 형식은 하한, 상한 및 이를 나타내는 텍스트 인수입니다.
-- 범위의 포괄성/배타성.
SELECT 숫자 범위(1.0, 14.0, '(]');

-- 세 번째 인수가 생략되면 '[)'로 간주됩니다.
SELECT 숫자범위(1.0, 14.0);

-- 여기서는 '(]'를 지정했지만 표시되는 값은 다음과 같이 변환됩니다.
-- int8range가 이산 범위 유형이므로 정식 형식입니다(아래 참조).
SELECT int8range(1, 14, '(]');

-- 두 경계 중 하나에 NULL을 사용하면 해당 측면의 범위가 제한되지 않습니다.
SELECT 숫자 범위(NULL, 2.2);

8.17.7. 이산 범위 사설 토토

불연속 범위는 요소 사설 토토이 잘 정의된 범위입니다."단계", 예를 들어정수또는날짜. 이러한 유형에는 유효한 요소가 없을 때 두 요소가 인접해 있다고 말할 수 있습니다. 그들 사이의 가치. 이는 연속 범위와 대조됩니다. 다른 요소를 식별하는 것은 항상(또는 거의 항상) 가능합니다. 주어진 두 값 사이의 값. 예를 들어,숫자사설 토토은 범위와 마찬가지로 연속형입니다. 끝났어타임스탬프. (그렇지만타임스탬프정밀도가 제한되어 있으므로 그럴 수도 있습니다. 이론적으로는 이산형으로 취급되므로 고려하는 것이 좋습니다. 단계 크기는 일반적으로 관심 대상이 아니기 때문에 연속형입니다.)

이산 범위 유형에 대해 생각하는 또 다른 방법은 다음과 같습니다. a의 명확한 아이디어는 다음과 같습니다."다음"또는"이전"각 요소 값에 대한 값입니다. 이를 알면 포괄적인 것과 포함적인 것 사이의 변환이 가능합니다. 다음을 선택하여 범위 경계의 배타적 표현 또는 원래 제공된 값 대신 이전 요소 값입니다. 에 대한 예, 정수 범위 유형에서[4,8]그리고(3,9)동일한 값 세트를 나타냅니다. 그러나 숫자 이상의 범위에서는 그렇지 않습니다.

불연속 범위 유형에는 다음이 있어야 합니다.정규화함수는 다음을 인식합니다. 요소 유형에 대해 원하는 단계 크기. 정규화 함수는 범위의 동등한 값을 변환하는 작업을 담당합니다. 특히 일관되게 동일한 표현을 갖는 유형 포함 또는 배타적 경계. 정규화 함수가 다음과 같은 경우 지정하지 않으면 서식이 다른 범위는 항상 동일한 세트를 나타내더라도 동일하지 않은 것으로 간주됩니다. 현실의 가치.

내장 범위 사설 토토int4range, int8range날짜 범위모두 다음을 포함하는 표준 형식을 사용합니다. 하한은 제외하고 상한은 제외합니다. 즉,[). 사용자 정의 범위 사설 토토은 다른 사설 토토을 사용할 수 있습니다. 그러나 규칙은 있습니다.

8.17.8. 새로운 범위 사설 토토 정의

사용자는 자신의 범위 유형을 정의할 수 있습니다. 가장 일반적인 이유 이를 수행하려면 다음 중 제공되지 않은 하위 사설 토토에 대한 범위를 사용하는 것입니다. 내장된 범위 유형. 예를 들어, 새로운 범위 유형을 정의하려면 하위 사설 토토float8:

CREATE TYPE floatrange AS RANGE(
    하위 사설 토토 = float8,
    subtype_diff = float8mi
);

SELECT '[1.234, 5.678]'::floatrange;

왜냐하면float8의미가 없습니다"단계", 우리는 이 예에서는 정규화 함수입니다.

하위 사설 토토이 연속 값,사설 토토 생성명령 a를 지정해야 합니다.표준함수. 는 정규화 함수는 입력 범위 값을 취하고, 다른 범위를 가질 수 있는 동등한 범위 값을 반환하고 서식 지정. 다음을 나타내는 두 범위에 대한 표준 출력 동일한 값 세트(예: 정수 범위)[1, 7]그리고[1, 8)이어야 합니다. 동일합니다. 어떤 표현을 선택하든 상관없습니다. 서로 다른 두 개의 동등한 값이 있는 한 표준적인 값입니다. 서식은 항상 동일한 값으로 매핑됩니다. 서식 지정. 포함/배타 범위 조정 외에도 형식, 정규화 함수는 경계를 반올림할 수 있습니다. 원하는 단계 크기가 단계 크기보다 큰 경우 하위 사설 토토은 저장할 수 있습니다. 예를 들어 범위 유형은 다음과 같습니다.타임스탬프단계를 갖도록 정의될 수 있습니다. 한 시간의 크기입니다. 이 경우 정규화 기능은 다음과 같습니다. 한 시간이 아닌 범위를 반올림해야 하거나 대신 오류가 발생할 수도 있습니다.

자신의 범위 유형을 정의하면 다음을 지정할 수도 있습니다. 사용할 다른 하위 사설 토토 B-트리 연산자 클래스 또는 데이터 정렬 어떤 값이 속하는지 결정하는 정렬 순서를 변경하려면 주어진 범위.

또한 GiST와 함께 사용되는 모든 범위 유형 또는 SP-GiST 인덱스는 하위 사설 토토 차이를 정의해야 합니다. 또는subtype_diff, 함수. (인덱스는 아직도 없이 일해요subtype_diff하지만 그렇죠 차이가 있는 경우보다 훨씬 덜 효율적일 가능성이 높습니다. 함수가 제공됩니다.) 하위 사설 토토 차이 함수는 두 가지를 취합니다. 하위 사설 토토의 값을 입력하고 그 차이를 반환합니다(예:X마이너스Y)는로 표현됩니다.float8값. 위의 예에서 다음 함수는 일반의 기초가 됨float8빼기 연산자 사용할 수 있습니다. 그러나 다른 하위 사설 토토의 경우 일부 유형 변환은 필요하다. 표현하는 방법에 대한 창의적인 생각 숫자가 필요할 수도 있으므로 차이점도 있습니다. 최대한 가능합니다.subtype_diff함수는 다음과 같습니다 선택한 연산자 클래스가 암시하는 정렬 순서에 동의합니다. 그리고 대조; 즉, 그 결과는 항상 긍정적이어야 합니다. 정렬에 따라 첫 번째 인수가 두 번째 인수보다 큽니다. 주문합니다.

참조PostgreSQL : 문서 : 9.3 : 토토 사이트 생성더 보기 범위 사설 토토 생성에 대한 정보입니다.

8.17.9. 인덱싱

GiST 및 SP-GiST 인덱스는 다음의 테이블 열에 대해 생성될 수 있습니다. 범위 유형. 예를 들어, GiST 인덱스를 생성하려면:

요점을 사용하여 예약에 대한 INDEX booking_idx 생성(중);

GiST 또는 SP-GiST 인덱스는 다음과 관련된 쿼리를 가속화할 수 있습니다. 범위 연산자:=, &&, <@, @, <<, , -|-, &<&(참조표 9-45용 자세한 내용).

또한 테이블에 대해 B-트리 및 해시 인덱스를 생성할 수 있습니다. 범위 사설 토토의 열입니다. 이러한 인덱스 사설 토토의 경우 기본적으로 유일한 유용한 범위 연산은 동일합니다. B-트리 정렬 순서가 있습니다. 해당하는 범위 값에 대해 정의됨<그리고연산자, 그러나 순서는 다소 임의적이며 일반적으로 다음 작업에서는 유용하지 않습니다. 현실 세계. 범위 유형의 B-트리 및 해시 지원은 주로 의미됩니다. 쿼리에서 내부적으로 정렬 및 해싱을 허용하는 대신 실제 인덱스 생성.

8.17.10. 범위에 대한 제약

그동안고유자연스러운 제약입니다 스칼라 값의 경우 일반적으로 범위 유형에 적합하지 않습니다. 대신, 제외 제약조건이 더 적합한 경우가 많습니다(참조테이블 생성 ... 제약 ... 제외). 제외 제약 조건은 다음을 허용합니다. 다음과 같은 제약 조건 지정"중복되지 않음"범위 유형에 대해. 예를 들면:

CREATE TABLE 예약(
    tsrange 동안,
    EXCLUDE USING 요지(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;
CREATE TABLE room_reservation (
    방 텍스트,
    tsrange 동안,
    EXCLUDE USING 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