이 문서는 지원되지 않는 PostgreSQL 버전에 대한 것입니다.
당신은 다음과 같은 페이지를 보고 싶을 수도 있습니다.PostgreSQL : 문서 : 17 : 8.16. 스포츠 토토 사이트 유형버전 또는 위에 나열된 다른 지원 버전 중 하나를 사용하세요.

8.16. 복합 유형

A 범퍼카 토토 유형는 다음을 나타냅니다. 행 또는 레코드의 구조; 그것은 본질적으로 단지 다음의 목록일 뿐입니다. 필드 이름 및 해당 데이터 유형입니다.포스트그레SQL범퍼카 토토 유형을 사용할 수 있습니다. 단순 유형을 사용할 수 있는 것과 동일한 방식으로 사용됩니다. 에 대한 예를 들어, 테이블의 열은 복합 열로 선언될 수 있습니다. 유형.

8.16.1. 복합 선언 유형

다음은 범퍼카 토토 유형을 정의하는 두 가지 간단한 예입니다.

CREATE TYPE 범퍼카 토토 AS(
    r 배정밀도,
    나는 이중 정밀도
);

CREATE TYPE Inventory_item AS(
    이름 텍스트,
    공급자_ID 정수,
    가격 숫자
);

구문은 다음과 비슷합니다.만들기 표, 단, 필드 이름과 유형만 가능함 지정됨; 제약 없음(예:아님 NULL)가 현재 포함될 수 있습니다. 참고하세요AS키워드는 필수입니다. 그것 없이는 시스템이 다른 종류의 생각유형 생성명령을 의미하며 이상한 구문 오류가 발생합니다.

유형을 정의한 후 이를 사용하여 테이블을 생성할 수 있습니다:

직접 테이블 생성(
    품목 Inventory_item,
    정수 카운트
);

INSERT INTO on_hand VALUES (ROW('퍼지 주사위', 42, 1.99), 1000);

또는 함수:

CREATE FUNCTION 가격_확장(inventory_item, 정수) RETURNS 숫자
AS 'SELECT $1.price * $2' LANGUAGE SQL;

현재 보유 중인 가격 확장(항목, 10) 선택;

테이블을 생성할 때마다 범퍼카 토토 유형도 테이블과 동일한 이름으로 자동 생성됩니다. 테이블의 행 유형을 나타냅니다. 예를 들어, 다음과 같이 말했습니다.

테이블 생성 Inventory_item(
    이름 텍스트,
    공급자_ID 정수 REFERENCES 공급업체,
    가격 숫자 확인(가격  0)
);

그럼 마찬가지inventory_item복합 위에 표시된 유형은 부산물로 생성될 수 있으며 위와 같이 사용됩니다. 그러나 중요한 제한 사항에 유의하십시오. 현재 구현: 제약 조건이 연관되어 있지 않기 때문에 범퍼카 토토 유형, 테이블 정의에 표시된 제약 조건적용하지 않음값에 테이블 외부의 범퍼카 토토 유형. (부분적인 해결 방법은 다음과 같습니다. 범퍼카 토토 유형의 멤버로 도메인 유형을 사용합니다.)

8.16.2. 복합 값 구성

복합 값을 리터럴 상수로 쓰려면 다음을 묶으십시오. 필드 값을 괄호 안에 넣고 쉼표로 구분하세요. 당신 모든 필드 값 주위에 큰따옴표를 넣을 수 있으며, 쉼표나 괄호가 포함되어 있습니다. (자세한 내용이 나타납니다.아래.) 따라서 일반 복합 상수의 형식은 다음과 같습니다.

'( 발1 , 발2 , ... )'

예는 다음과 같습니다:

'("퍼지 주사위",42,1.99)'

이것은 유효한 값이 될 것입니다.inventory_item위에 정의된 유형입니다. 필드를 만들려면 NULL이면 목록의 해당 위치에 문자를 전혀 쓰지 않습니다. 예를 들어, 이 상수는 NULL 세 번째 필드를 지정합니다.

'("퍼지 주사위",42,)'

NULL이 아닌 빈 문자열을 원하면 double을 쓰세요 인용문:

'("",42,)'

여기서 첫 번째 필드는 NULL이 아닌 빈 문자열이고, 세 번째 필드는 NULL.

(이 상수는 실제로 일반 상수의 특별한 경우일 뿐입니다. 에서 논의된 유형 상수섹션 4.1.2.7. 상수는 처음에는 문자열로 처리되며 범퍼카 토토형 입력 변환 루틴으로 전달됩니다. 명시적인 변환할 유형을 알려면 유형 지정이 필요할 수 있습니다. 상수입니다.)

ROW표현식 구문은 다음과 같을 수도 있습니다. 복합 값을 구성하는 데 사용됩니다. 대부분의 경우 이는 문자열 리터럴 구문보다 사용하기가 훨씬 간단합니다. 여러 레이어의 인용에 대해 걱정할 필요가 없습니다. 우리 위에서 이미 이 방법을 사용했습니다:

ROW('퍼지 주사위', 42, 1.99)
ROW('', 42, NULL)

ROW 키워드는 더 많은 키워드가 있는 한 실제로 선택 사항입니다. 표현식의 필드가 두 개 이상이므로 단순화할 수 있습니다. 에:

('퍼지 주사위', 42, 1.99)
('', 42, NULL)

ROW표현식 구문이 논의됩니다 더 자세히는섹션 4.2.13.

8.16.3. 범퍼카 토토 유형에 액세스

범퍼카 토토 열의 필드에 접근하려면 점을 쓰고 테이블 이름에서 필드를 선택하는 것과 비슷합니다. 에서 사실 이는 자주 사용하는 테이블 이름에서 선택하는 것과 매우 흡사합니다. 파서가 혼동되지 않도록 괄호를 사용해야 합니다. 에 대한 예를 들어, 우리의 일부 하위 필드를 선택하려고 할 수 있습니다.현재다음과 같은 테이블 예시:

현재 보유하고 있는 WHERE item.price  9.99에서 item.name을 선택하세요.

이름 이후로는 작동하지 않습니다.항목다음의 열 이름이 아닌 테이블 이름으로 간주됩니다.현재, SQL 구문 규칙에 따라. 꼭 쓰셔야 해요 이렇게:

선택 (항목).이름 FROM 현재 WHERE (항목).가격  9.99;

또는 테이블 이름도 사용해야 하는 경우(예: 다중 테이블 쿼리), 다음과 같습니다:

SELECT (on_hand.item).name FROM on_hand WHERE (on_hand.item).price  9.99;

이제 괄호 안에 있는 개체는 다음과 같이 올바르게 해석됩니다. 에 대한 참조항목열, 그리고 하위 필드를 선택할 수 있습니다.

다음에서 필드를 선택할 때마다 유사한 구문 문제가 적용됩니다. 복합 값. 예를 들어, 다음 중 하나의 필드만 선택하려면 복합 값을 반환하는 함수의 결과를 얻으려면 다음을 수행해야 합니다. 다음과 같이 작성하세요:

SELECT (my_func(...)).field FROM ...

추가 괄호가 없으면 구문이 생성됩니다. 오류.

특수 필드 이름*의미"모든 필드", 자세한 설명은섹션 8.16.5.

8.16.4. 수정 중 범퍼카 토토 유형

다음은 삽입 및 삽입에 대한 올바른 구문의 몇 가지 예입니다. 복합 열을 업데이트합니다. 먼저 전체를 삽입하거나 업데이트합니다. 열:

INSERT INTO mytab(complex_col) VALUES((1.1,2.2));

업데이트 mytab SET complex_col = ROW(1.1,2.2) WHERE ...;

첫 번째 예에서는 생략ROW, 두 번째 그것을 사용합니다; 어느 쪽이든 할 수 있었을 텐데.

범퍼카 토토 열의 개별 하위 필드를 업데이트할 수 있습니다.

mytab 설정 업데이트 complex_col.r = (complex_col).r + 1 WHERE ...;

여기에 우리가 넣을 필요가 없다는 점에 주목하세요. 바로 뒤에 나타나는 열 이름 주위에 괄호세트, 하지만 참조할 때는 괄호가 필요합니다. 등호 오른쪽에 있는 표현식의 동일한 열입니다.

그리고 하위 필드를 대상으로 지정할 수 있습니다.삽입도:

mytab에 삽입(complex_col.r, complex_col.i) VALUES(1.1, 2.2);

열의 모든 하위 필드에 값을 제공하지 않았다면, 나머지 하위 필드는 null로 채워졌을 것입니다. 값.

8.16.5. 쿼리에 범퍼카 토토 유형 사용

다양한 특수 구문 규칙 및 관련 동작이 있습니다. 쿼리에 범퍼카 토토 유형이 있습니다. 이 규칙은 유용한 정보를 제공합니다. 단축키를 사용하지만 그 뒤에 숨은 논리를 모르면 혼란스러울 수 있습니다. 그들.

PostgreSQL, 다음에 대한 참조 쿼리의 테이블 이름(또는 별칭)은 사실상 테이블 이름에 대한 참조입니다. 테이블의 현재 행의 합성 값입니다. 예를 들어, 테이블inventory_item표시된 대로, 우리는 할 수 있어요 쓰다:

inventory_item c에서 c 선택;

이 쿼리는 단일 복합 값 열을 생성하므로 다음과 같은 출력이 나올 수 있습니다:

c
-----------
 ("퍼지 주사위",42,1.99)
(1행)

그러나 단순 이름은 열 이름과 일치한다는 점에 유의하십시오. 테이블 이름 앞에는 테이블 이름이 없기 때문에 이 예가 작동합니다. 이름이 지정된 열c쿼리의 테이블.

일반적인 정규화된 열 이름 구문테이블_이름.열_이름될 수 있습니다 신청하는 것으로 이해됩니다필드 선택에 테이블의 현재 행의 합성 값입니다. (효율성을 위해 이유 때문에 실제로는 그런 식으로 구현되지 않았습니다.)

우리가 쓸 때

SELECT c.* FROM Inventory_item c;

그러면 SQL 표준에 따라 내용을 가져와야 합니다 별도의 열로 확장된 테이블:

이름 | 공급자_ID | 가격
----------+-------------+-------
 퍼지 주사위 |          42 |  1.99
(1행)

마치 쿼리가 다음과 같은

SELECT c.name, c.supplier_id, c.price FROM Inventory_item c;

PostgreSQL이것을 적용하겠습니다 복합 값 표현식에 대한 확장 동작은 다음과 같습니다. 표시됨당신은 해당 값 주위에 괄호를 써야 합니다..*간단한 테이블이 아닐 때마다 적용됩니다. 이름. 예를 들어, 만약myfunc()은 열이 포함된 범퍼카 토토 유형을 반환하는 함수a, bc, 그러면 이 두 쿼리에는 같은 결과:

SELECT (myfunc(x)).* FROM some_table;
SELECT (myfunc(x)).a, (myfunc(x)).b, (myfunc(x)).c FROM some_table;

팁: PostgreSQL처리 실제로 첫 번째 형식을 다음 형식으로 변환하여 열 확장 두 번째. 따라서 이 예에서는,myfunc()두 구문 중 하나를 사용하면 행당 세 번 호출됩니다. 그렇다면 비용이 많이 드는 기능은 피하고 싶을 수도 있지만 그렇게 할 수는 없습니다. 다음과 같은 쿼리로:

SELECT (m).* FROM (SELECT myfunc(x) AS m FROM some_table OFFSET 0) ss;

오프셋 0절은 최적화 프로그램을 유지합니다. 에서"평탄화"하위 선택 여러 번 호출하여 양식에 도달함myfunc().

범퍼카 토토_값.*구문은 이런 종류의 열 확장을 초래합니다 a의 최상위 수준에 나타날 때선택출력 목록, 아돌아오는 중목록삽입/업데이트/삭제, 아또는 a행 생성자. 다른 모든 컨텍스트(중첩된 경우 포함) 해당 구성 중 하나 내부), 첨부.*범퍼카 토토 값에 대한 값은 변경되지 않습니다. 그 뜻이니까"모든 열"그래서 동일한 합성 값이 다시 생성됩니다. 예를 들어, 만약somefunc()범퍼카 토토 값을 허용합니다. 인수, 이 쿼리는 동일합니다.

select somefunc(c.*) FROM Inventory_item c;
Inventory_item c에서 somefunc(c)를 선택하세요.

두 경우 모두, 현재 행inventory_item는 함수에 다음과 같이 전달됩니다. 단일 복합 값 인수. 그래도.*이런 경우에는 아무것도 하지 않습니다. 사용하는 것이 좋습니다 스타일을 사용하면 범퍼카 토토 값이 의도된 것이 분명해지기 때문입니다. 에서 특히 파서는 고려할 것입니다.cc.*테이블 이름이나 별칭을 참조하는 것이 아니라 모호함이 없도록 열 이름에 추가합니다. 반면 없이.*, 여부는 확실하지 않습니다c테이블 이름이나 열 이름을 의미하며 실제로는 열 이름 해석이 선호되는 경우 이름이 지정된 열c.

이러한 개념을 보여주는 또 다른 예는 쿼리는 같은 의미입니다:

SELECT * FROM Inventory_item c ORDER BY c;
SELECT * FROM Inventory_item c ORDER BY c.*;
SELECT * FROM Inventory_item c ORDER BY ROW(c.*);

이 모든 것주문 기준절 지정 행의 범퍼카 토토 값입니다. 그러나 만일inventory_item이름이 지정된 열이 포함되어 있습니다.c, 첫 번째 경우는 다를 것입니다. 해당 열로만 정렬한다는 의미이기 때문입니다. 이전에 표시된 열 이름이 주어지면 이러한 쿼리도 위와 동일합니다:

SELECT * FROM Inventory_item c ORDER BY ROW(c.name, c.supplier_id, c.price);
SELECT * FROM Inventory_item c ORDER BY (c.name, c.supplier_id, c.price);

(마지막 사례는 키워드가 있는 행 생성자를 사용합니다.ROW생략되었습니다.)

범퍼카 토토과 관련된 또 다른 특수 구문 동작 값은 우리가 사용할 수 있다는 것입니다.기능적 표기범퍼카 토토 값의 필드를 추출하기 위한 것입니다. 는 이것을 설명하는 간단한 방법은 표기법입니다.필드(테이블)그리고테이블.필드교환 가능합니다. 예를 들어, 다음 쿼리는 동일합니다.

select c.name FROM Inventory_item c WHERE c.price  1000;
SELECT 이름(c) FROM Inventory_item c WHERE 가격(c)  1000;

게다가 단일 인수를 받는 함수가 있는 경우 범퍼카 토토 유형의 경우 두 표기법 중 하나로 호출할 수 있습니다. 이것들 쿼리는 모두 동일합니다.

inventory_item c에서 somefunc(c)를 선택하세요.
SELECT somefunc(c.*) FROM Inventory_item c;
Inventory_item c에서 c.somefunc를 선택하세요.

함수 표기법과 필드 표기법의 동등성 범퍼카 토토 유형에서 함수를 사용하여 구현할 수 있습니다."계산된 필드". 사용하는 애플리케이션 위의 마지막 쿼리에서는 이를 직접 인식할 필요가 없습니다.somefunc은(는) 실제 열이 아닙니다. 테이블.

팁:이러한 행동 때문에 동일한 이름의 단일 범퍼카 토토 유형 인수를 취하는 함수 해당 범퍼카 토토 유형의 필드 중 하나로. 모호한 점이 있는 경우, 필드 이름 해석이 선호되므로 트릭 없이는 함수를 호출할 수 없습니다. 강제로 하는 방법 중 하나는 함수 해석은 함수 이름을 스키마로 한정하는 것입니다. 즉, 쓰세요스키마.펑크(범퍼카 토토값).

8.16.6. 복합형 입력 및 출력 구문

복합 값의 외부 텍스트 표현은 다음과 같습니다. I/O 변환 규칙에 따라 해석되는 항목 개별 필드 유형에 대한 추가 정보를 나타내는 장식 복합 구조. 장식은 괄호로 구성됩니다. ((그리고)) 주변 전체 값과 쉼표(,) 사이 인접한 항목. 괄호 밖의 공백은 무시되지만 괄호 안의 값은 필드 값의 일부로 간주됩니다. 입력에 따라 중요할 수도 있고 그렇지 않을 수도 있습니다. 필드 데이터 유형에 대한 변환 규칙입니다. 예를 들어, 다음과 같습니다:

'(  42)'

필드 유형이 정수인 경우 공백은 무시되지만, 텍스트라면 그렇지 않습니다.

이전에 표시된 것처럼 복합 값을 쓸 때 다음을 수행할 수 있습니다. 개별 필드 값 주위에 큰따옴표를 씁니다. 당신은반드시필드가 다음과 같은 경우 그렇게 하십시오. 그렇지 않으면 값이 복합 값 파서를 혼란스럽게 할 것입니다. 에서 특히, 괄호, 쉼표, 큰따옴표가 포함된 필드, 또는 백슬래시는 큰따옴표로 묶어야 합니다. 큰따옴표를 넣거나 인용된 복합 필드 값의 백슬래시 앞에는 백슬래시. (또한 큰따옴표 안에 큰따옴표 한 쌍이 필드 값은 큰따옴표 문자를 나타내기 위해 사용됩니다. SQL 리터럴 문자열의 작은따옴표 규칙과 유사합니다.) 또는 인용을 피하고 백슬래시 이스케이프를 사용하여 그렇지 않으면 다음과 같이 간주되는 모든 데이터 문자를 보호하십시오. 복합 구문.

완전히 비어 있는 필드 값(다음 사이에 문자가 전혀 없음) 쉼표 또는 괄호)는 NULL을 나타냅니다. 다음과 같은 값을 쓰려면 NULL이 아닌 빈 문자열, 쓰기"".

복합 출력 루틴은 필드 주위에 큰따옴표를 넣습니다. 값이 빈 문자열이거나 괄호, 쉼표, 큰따옴표, 백슬래시 또는 공백. (흰색으로 하면 공백은 필수는 아니지만 가독성을 높이는 데 도움이 됩니다.) 큰따옴표 및 필드 값에 포함된 백슬래시는 두 배가 됩니다.

참고:SQL 명령에 작성한 내용이 먼저 문자열 리터럴로 해석된 다음 복합 문자로 해석됩니다. 이렇게 하면 필요한 백슬래시 수가 두 배로 늘어납니다(이스케이프를 가정하면 문자열 구문이 사용됩니다). 예를 들어,텍스트큰따옴표와 백슬래시가 포함된 필드 복합 값의 경우 다음과 같이 작성해야 합니다.

삽입 ... 값 ('("\"\\")');

문자열 리터럴 프로세서는 한 수준의 백슬래시를 제거합니다. 복합 값 파서에 도착하는 내용은 다음과 같습니다.("\"\\"). 차례로, 문자열은텍스트데이터 유형의 입력 루틴은 다음과 같습니다"\. (데이터 유형으로 작업하는 경우 입력 루틴도 백슬래시를 특별히 처리했습니다.바이테아예를 들어, 8개 정도 필요할 수 있습니다 백슬래시 하나를 저장된 항목으로 가져오는 명령의 백슬래시 복합 필드.) 달러 인용(참조섹션 4.1.2.4)를 사용하면 두 배로 늘릴 필요가 없습니다. 백슬래시.

팁:ROW생성자 구문 일반적으로 범퍼카 토토 리터럴 구문보다 작업하기가 더 쉽습니다. SQL 명령에 범퍼카 토토 값을 쓸 때. 에서ROW, 개별 필드 값은 동일하게 작성됩니다. 복합의 구성원이 아닐 때 작성되는 방식입니다.