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

10.2. 운영자

연산자가 참조하는 특정 연산자 발현은 다음 절차를 사용하여 결정됩니다. 참고하세요 이 절차는 다음의 우선순위에 의해 간접적으로 영향을 받습니다. 연산자가 관련됩니다. 이에 따라 하위 표현식이 결정됩니다. 어떤 연산자의 입력으로 간주됩니다. 보다섹션 4.1.6더 보기 정보.

운영자 유형 확인

  1. 다음에서 고려할 연산자를 선택하세요.pg_operator시스템 카탈로그. 만약 스키마에 한정되지 않은 연산자 이름이 사용되었습니다(일반적인 경우). 고려되는 연산자는 이름과 인수가 일치하는 연산자입니다. 현재 검색 경로에 표시되는 개수(참조섹션 5.7.3). 만약 자격을 갖춘 운영자 이름이 지정되었습니다. 지정된 운영자만 스키마가 고려됩니다.

    1. 검색 경로가 동일한 토토 결과를 여러 개 찾은 경우 인수 유형 중 경로에서 가장 먼저 나타나는 인수 유형만 고려. 다양한 인수 유형을 가진 토토 결과가 고려됩니다. 검색 경로 위치에 관계없이 동등한 입장에서.

  2. 입력 인수를 정확하게 받아들이는 토토 결과를 확인하세요 유형. 존재하는 경우(세트에 정확히 일치하는 항목은 하나만 있을 수 있음) 고려한 토토 결과)를 사용하십시오. 정확한 일치가 없으면 인증된 이름을 통해 전화할 때 보안 위험이 있습니다.[1](아님 일반적) 신뢰할 수 없는 것을 허용하는 스키마에서 발견된 모든 연산자 사용자는 객체를 생성합니다. 그러한 상황에서는 다음과 같은 주장을 펼칩니다. 정확히 일치하도록 강제합니다.

    1. 이항 연산자 호출의 인수 중 하나가 다음인 경우알 수 없음유형, 그런 다음 동일한 유형이라고 가정합니다. 이 검사에 대한 다른 인수로 사용됩니다. 두 가지를 포함하는 호출알 수 없음입력 또는 단항 토토 결과(알 수 없음입력, 다음에서 일치하는 항목을 찾을 수 없습니다. 이 단계.

    2. 이항 연산자 호출의 인수 중 하나가 다음인 경우알 수 없음유형이고 다른 하나는 도메인에 속합니다. 입력하고, 다음으로 정확하게 수락하는 운영자가 있는지 확인하세요. 양쪽의 도메인 기본 유형 그렇다면 사용하세요.

  3. 가장 일치하는 항목을 찾으세요.

    1. 입력 유형이 아닌 후보 연산자를 폐기합니다. 일치하지만 다음으로 변환할 수 없습니다(암시적 변환 사용). 일치합니다.알 수 없음리터럴은 다음과 같이 가정됩니다. 이 목적을 위해 무엇이든 변환 가능합니다. 후보가 1명뿐인 경우 남아 있으면 사용하세요. 그렇지 않으면 다음 단계로 진행하세요.

    2. 입력 인수가 도메인 유형인 경우 다음으로 처리합니다. 모든 후속 단계에 대한 도메인의 기본 유형입니다. 이는 다음을 보장합니다. 도메인은 다음 목적을 위해 기본 유형처럼 작동합니다. 모호한 연산자 해결.

    3. 모든 후보를 살펴보고 가장 정확한 후보를 유지하세요. 입력 유형과 일치합니다. 정확한 후보가 없으면 모든 후보를 유지합니다. 일치합니다. 후보가 하나만 남아 있으면 해당 후보를 사용하십시오. 그렇지 않으면 계속 다음 단계로.

    4. 모든 후보자를 검토하고 선호하는 후보자를 유지합니다. 유형(입력 데이터 유형의 유형 카테고리 중) 최대 유형 변환이 필요한 위치. 모두 유지 선호하는 유형을 허용하지 않는 경우 후보자. 후보가 1명뿐인 경우 남아 있으면 사용하세요. 그렇지 않으면 다음 단계로 진행하세요.

    5. 입력 인수가 다음과 같은 경우알 수 없음, 확인 해당 인수 위치에서 허용되는 유형 범주 남은 후보. 각 위치에서 다음을 선택합니다.문자열후보자가 해당 카테고리를 수락하는 경우 카테고리. (문자열에 대한 이러한 편견은 알 수 없는 유형이기 때문에 적절합니다. 리터럴은 문자열처럼 보입니다.) 그렇지 않으면 나머지 모든 후보자가 동일한 유형 카테고리를 승인하면 해당 카테고리를 선택하십시오. 그렇지 않으면 실패합니다. 왜냐하면 올바른 선택이 없이는 추론될 수 없기 때문입니다. 더 많은 단서. 이제 선택한 것을 받아들이지 않는 후보자를 폐기하십시오. 유형 카테고리. 또한, 후보자가 선호하는 사항을 수락하는 경우 해당 카테고리를 입력하고, 선호하지 않는 항목을 허용하는 후보를 삭제하세요. 해당 인수의 유형입니다. 살아남은 후보자가 없으면 모든 후보자를 유지하십시오. 테스트. 후보가 하나만 남아 있으면 해당 후보를 사용하십시오. 그렇지 않으면 계속해서 다음 단계.

    6. 둘 다 있는 경우알 수 없음및 알려진 유형 인수와 모든 알려진 유형의 인수는 동일한 유형을 갖습니다. 다음과 같이 가정합니다.알 수 없음인수는 다음과 같습니다. 해당 유형을 확인하고 해당 유형을 수락할 수 있는 후보자를 확인하세요.알 수 없음-인수 위치. 정확히 하나라면 후보자가 이 테스트를 통과했다면 사용하세요. 그렇지 않으면 실패합니다.

몇 가지 예가 이어집니다.

예제 10-1. 계승 토토 결과 유형 해결

계승 토토 결과는 하나만 있습니다(접미사!)은 표준 카탈로그에 정의되어 있으며 유형의 인수비긴트. 스캐너가 할당합니다 초기 유형정수인수에 이 쿼리 표현식:

선택 40 ! AS "40 계승";

                   40 계승
-------------------------------------
 815915283247897734345611269596115894272000000000
(1행)

그래서 파서는 피연산자에 대한 유형 변환을 수행하고 쿼리는 다음과 같습니다:

캐스트 선택(40 AS bigint) ! AS "40 계승";

예제 10-2. 문자열 연결 연산자 유형 해결

문자열과 유사한 구문은 문자열 유형 작업에 사용되며 복잡한 확장 유형 작업에 사용됩니다. 지정되지 않은 문자열 유형은 가능한 연산자 후보와 일치합니다.

하나의 지정되지 않은 인수가 있는 예:

텍스트 'abc' 선택 || 'def' AS "텍스트 및 알 수 없음";

 텍스트가 있고 알 수 없음
------------------
 abcdef
(1행)

이 경우 파서는 토토 결과가 있는지 확인합니다. 복용텍스트두 인수 모두에 대해. 거기서부터 즉, 두 번째 인수는 다음과 같이 해석되어야 한다고 가정합니다. 유형텍스트.

다음은 지정되지 않은 유형의 두 값을 연결한 것입니다:

'abc' 선택 || 'def' AS "지정되지 않음";

 불특정
-------------
 abcdef
(1행)

이 경우 사용할 유형에 대한 초기 힌트가 없습니다. 쿼리에 유형이 지정되지 않았기 때문입니다. 그래서 파서는 다음을 찾습니다. 모든 후보 연산자를 검색하고 후보가 있음을 찾습니다. 문자열 범주 및 비트 문자열 범주 입력을 모두 허용합니다. 가능한 경우 문자열 카테고리가 선호되므로 해당 카테고리는 선택한 다음 선호하는 문자열 유형을 선택합니다.텍스트는 다음을 해결하기 위한 특정 유형으로 사용됩니다. 알 수 없는 유형의 리터럴 as.

예제 10-3. 절대값 및 부정 토토 결과 유형 해결

PostgreSQL운영자 카탈로그 접두사 토토 결과에 대한 여러 항목이 있습니다.@, 모두 절대값 연산을 구현합니다. 다양한 숫자 데이터 유형에 대해 다음 항목 중 하나는 유형에 대한 것입니다.float8는 다음에서 선호되는 유형입니다. 숫자 카테고리. 그러므로포스트그레SQL다음에 직면했을 때 해당 항목을 사용합니다 an알 수 없음입력:

SELECT @ '-4.5' AS "abs";
 복근
-----
 4.5
(1행)

여기서 시스템은 알 수 없는 유형 리터럴을 암시적으로 해결했습니다. 유형으로float8선택한 항목을 적용하기 전에 운영자. 우리는 그것을 확인할 수 있습니다float8아니요 다른 유형이 사용되었습니다:

SELECT @ '-4.5e500' AS "abs";

오류: "-4.5e500"이 배정밀도 유형의 범위를 벗어났습니다.

반면에 접두사 토토 결과~(비트 부정)은 정수에 대해서만 정의됩니다. 데이터 유형이 아닙니다.float8. 그래서 우리가 시도한다면 비슷한 경우~, 우리는 다음을 얻습니다:

SELECT ~ '20' AS "부정";

오류: 연산자가 고유하지 않습니다. ~ "알 수 없음"
힌트: 가장 적합한 후보 연산자를 선택할 수 없습니다. 추가해야 할 수도 있습니다.
명시적인 유형 캐스팅.

이는 시스템이 다음 중 어느 것을 결정할 수 없기 때문에 발생합니다. 여러 개 가능~연산자는 다음과 같아야 합니다. 선호됩니다. 명시적인 캐스트를 통해 도움을 드릴 수 있습니다.

SELECT ~ CAST('20' AS int8) AS "부정";

 부정
----------
      -21
(1행)

예제 10-4. 배열 포함 토토 결과 유형 해결

다음은 알려진 연산자를 사용하여 연산자를 해결하는 또 다른 예입니다. 그리고 하나의 알 수 없는 입력:

SELECT array[1,2] <@ '1,2,3' as "is subset";

 부분 집합입니다
-----------
 티
(1행)

PostgreSQL운영자 카탈로그 중위 토토 결과에 대한 여러 항목이 있습니다.<@, 하지만 받아들일 수 있는 단 두 사람 왼쪽의 정수 배열은 배열 포함입니다. (아무 배열 <@ 아무 배열) 및 범위 포함(모든 요소 <@ anyrange). 이러한 다형성 의사 유형은 하나도 없기 때문에 (참조토토 사이트 순위 PostgreSQL : 문서 : 9.3 : Pseudo-types)은 선호되는 것으로 간주되면 파서가 모호성을 해결할 수 없습니다. 그 기초. 그러나3단계.f말해 알 수 없는 유형의 리터럴이 다음과 같은 유형이라고 가정합니다. 다른 입력, 즉 정수 배열입니다. 이제 둘 중 하나만 연산자가 일치할 수 있으므로 배열 포함이 선택됩니다. (범위가 있었다 포함을 선택했다면 오류가 발생했을 것입니다. 문자열은 범위 리터럴이 되기에 적합한 형식이 아닙니다.)

예제 10-5. 도메인 유형의 사용자 정의 토토 결과

사용자는 때때로 단지 도메인 유형. 이것은 가능하지만 그다지 유용하지는 않습니다. 운영자 해결 규칙은 다음과 같이 설계되었기 때문에 보일 수도 있습니다. 도메인의 기본 유형에 적용되는 연산자를 선택합니다. 예를 들어 고려하다

DOMAIN mytext를 텍스트 CHECK(...)로 생성;
CREATE FUNCTION mytext_eq_text (mytext, text) RETURNS 부울 AS ...;
CREATE OPERATOR = (절차=mytext_eq_text, leftarg=mytext, rightarg=text);
CREATE TABLE mytable(val mytext);

SELECT * FROM mytable WHERE val = 'foo';

이 쿼리는 사용자 정의 토토 결과를 사용하지 않습니다. 파서는 먼저 a가 있는지 확인하세요.mytext = 마이텍스트토토 결과 (2.a단계), 이는 없습니다. 그런 다음 도메인의 기본 유형을 고려합니다.텍스트, 그리고 a가 있는지 확인하세요.텍스트 = 텍스트토토 결과 (2단계.b), 이는 있다; 그래서 그것은 해결됩니다.알 수 없음-유형 리터럴 다음과 같이텍스트그리고 다음을 사용합니다텍스트 = 텍스트토토 결과. 사용자 정의 토토 결과를 얻는 유일한 방법 사용되는 것은 리터럴을 명시적으로 캐스팅하는 것입니다.

SELECT * FROM mytable WHERE val = 텍스트 'foo';

그래서마이텍스트 = 텍스트연산자를 찾았습니다 정확히 일치 규칙에 따라 즉시. 가장 잘 어울리는 경우 규칙에 도달하면 운영자를 적극적으로 차별합니다. 도메인 유형. 그렇지 않은 경우 해당 운영자는 다음을 생성합니다. 캐스팅 규칙이 항상 다르기 때문에 모호한 연산자 실패가 많이 발생합니다. 도메인을 기본 유형으로 또는 기본 유형에서 캐스팅할 수 있는 것으로 간주하므로 도메인 운영자는 다음과 같은 모든 경우에 사용 가능한 것으로 간주됩니다. 기본 유형에 비슷한 이름의 연산자가 있습니다.

참고

[1]

스키마로 한정되지 않은 이름으로는 위험이 발생하지 않습니다. 신뢰할 수 없는 것을 허용하는 스키마가 포함된 검색 경로 때문입니다. 사용자가 객체를 생성하는 것은 a가 아닙니다.보안 스키마 사용 패턴.