운영자 평가
pg_operator 시스템에서 정확히 일치하는지 확인하세요 카탈로그.
이항 연산자의 인수 중 하나가 다음과 같은 경우알 수 없음, 그러면 다음과 같은 유형이라고 가정합니다. 다른 주장.
인수를 뒤집어서 정확히 일치하는 항목을 찾으세요 자신을 가리키는 연산자로 교환 가능. 발견되면 다음의 인수를 반대로 바꿉니다. 트리를 구문 분석하고 이 연산자를 사용하세요.
가장 일치하는 항목을 찾으세요.
같은 이름을 가진 모든 운영자의 목록을 만드세요.
목록에 단 하나의 연산자만 있는 경우, 다음과 같은 경우에 이를 사용하십시오. 입력 유형은 강제될 수 있으며, 유형이 다음과 같은 경우 오류가 발생합니다. 강요할 수 없습니다.
다음에 대해 가장 명시적으로 일치하는 모든 연산자를 유지하십시오. 유형. 명시적으로 일치하는 항목이 없으면 모두 유지하고 이동합니다. 다음 단계로. 후보가 1명만 남으면 이를 사용 유형을 강제할 수 있는 경우.
입력 인수가 "알 수 없음"인 경우, 부울, 숫자, 문자열, 기하학 등의 입력 후보 또는 사용자 정의. 카테고리가 혼합되어 있거나 그 이상이 있는 경우 사용자 정의 유형이 하나 이상인 경우 오류가 발생합니다. 더 많은 단서 없이는 올바른 선택을 추론할 수 없습니다. 만약에 하나의 카테고리만 존재하는 경우 "선호하는" 카테고리를 지정하십시오. "이전에 입력된 입력 열에"를 입력합니다. "알 수 없음".
가장 정확한 유형 일치를 가진 후보를 선택하십시오. 각 열의 "선호 유형"과 일치하는 이전 단계의 카테고리입니다. 아직 더 남았다면 후보가 두 명 이상이거나, 후보가 없으면 다음을 던집니다. 오류.
다음에는 지수 연산자가 하나만 정의되어 있습니다. 카탈로그가 필요합니다.float8인수. 스캐너는 초기 토토을 할당합니다.int4이 쿼리 표현식의 두 인수 모두:
tgl= "Exp"로 2 ^ 3을 선택합니다. 경험치 --- 8 (1행)그래서 파서는 피연산자와 피연산자 모두에 대해 유형 변환을 수행합니다. 쿼리는 다음과 같습니다.
tgl= float8(2) ^ float8(3) AS "Exp"를 선택하십시오. 경험치 --- 8 (1행)또는
tgl= "Exp"로 2.0 ^ 3.0을 선택합니다. 경험치 --- 8 (1행)
참고:이 마지막 양식은 오버헤드가 가장 적습니다. 암시적 토토 변환을 수행하기 위해 함수가 호출됩니다. 이것은 아니다 작은 쿼리에 대한 문제이지만 쿼리에 영향을 미칠 수 있습니다. 큰 테이블과 관련된 쿼리 성능.
문자열과 유사한 구문은 다음과 같이 문자열 유형으로 작업하는 데 사용됩니다. 복잡한 확장 유형으로 작업하는 경우에도 마찬가지입니다. 문자열 지정되지 않은 유형은 가능한 연산자 후보와 일치합니다.
지정되지 않은 인수 1개:
tgl= 'abc' 텍스트 선택 || 'def' AS "텍스트 및 알 수 없음"; 텍스트 및 알 수 없음 ---------------- abcdef (1행)
이 경우 파서는 연산자가 있는지 확인합니다. 복용텍스트두 인수 모두에 대해. 이후 두 번째 인수가 해석되어야 한다고 가정합니다. 토토에 따라텍스트.
지정되지 않은 토토에 대한 연결:
tgl= 'abc' 선택 || 'def' AS "지정되지 않음"; 지정되지 않음 ----------- abcdef (1행)
이 경우 사용할 유형에 대한 초기 힌트가 없습니다. 쿼리에 유형이 지정되지 않았기 때문입니다. 그래서 파서는 다음을 찾습니다. 모든 후보 연산자를 검색하고 모든 인수에 대한 모든 인수를 찾습니다. 후보는 문자열 유형입니다. "선호되는 유형"을 선택합니다. 문자열,텍스트, 이 쿼리의 경우.
참고:사용자가 새로운 유형을 정의하고 연산자 "||" 작업을 수행하면 이 쿼리는 더 이상 쓰여진 대로 성공합니다. 파서에는 이제 후보 유형이 있습니다. 두 카테고리 중 어떤 카테고리를 사용할지 결정할 수 없었습니다.
이 예는 흥미로운 결과를 보여줍니다. 전통적으로, 계승 연산자는 정수에 대해서만 정의됩니다. 그만큼포스트그레스운영자 카탈로그에는 정수 피연산자를 사용하는 계승에 대한 항목 1개. 주어진 경우 정수가 아닌 숫자 인수,포스트그레그 인수를 다음으로 변환하려고 시도할 것입니다. 계승 평가를 위한 정수입니다.
tgl= 선택(4.3 !);
?열?
--------
24
(1행)
참고:물론 이것은 수학적으로 의심스러운 결과를 낳습니다 결과적으로, 원칙적으로 정수가 아닌 값의 계승은 그렇지 않기 때문입니다. 정의되었습니다. 그러나 데이터베이스의 역할은 가르치는 것이 아닙니다. 수학이지만 데이터 조작을 위한 도구입니다. 사용자인 경우 부동 소수점 숫자의 계승을 선택합니다.포스트그레부응하려고 노력할 것입니다.