2010-02-18 4 views
1

필자는 재귀 함수를 작성했으며 출력에 따라 다른 필드를 선택해야합니다. 내 질문은 지금, 어떻게 한 번 이상 함수를 호출하지 않고도 여러 번이 작업을 수행 할 수 있습니까? 내가 지금하고있는 일은 단지 CASE WHEN... 조건을 사용하고 함수가 반환 할 때마다 검사하는 것입니다. (이것은 단지 의사 코드와 실제 아무것도하지 않는, 그냥 이해의)PostgreSQL 조건부 선택

SELECT 
id, 
(CASE WHEN (function(id) > 0) 
    THEN field1 
    ELSE field2 
END) as value1, 
(CASE WHEN (function(id) > 0) 
    THEN field3 
    ELSE field4 
END) as value2, 
(CASE WHEN (function(id) > 0) 
    THEN field5 
    ELSE field6 
END) as value3 
FROM table1 
... 
내가이 쿼리를 최적화하고 한 번만 함수를 호출 할 수있는 방법

? 미리 감사드립니다.

+0

과 경험이 없다? –

+0

언어는 PL/pgSQL입니다. – stefita

+0

당신이 IMMUTABLE을 사용하는 답을 받아 들인 것은 이상하지만, 당신의 기능이 "다른 테이블에서 값을 선택하고 그 특정 ID에 대해 변경 될 수있다"는 의견을 말한다. Postgres는 불변 함수의 결과를 캐시하는 시간을 알려주지 않기 때문에 IMMUTABLE 함수를 표시하지 않았기를 바랍니다. –

답변

2

함수가 IMMUTABLE를 선언하면, 그것이 재평가되지 않으므로 여러 번 호출하는 것이 안전합니다. docs에서

:

IMMUTABLE 함수가 데이터베이스를 수정하고 동일한 인수 값을 부여 할 때 항상 같은 결과를 반환 할 수 없음을 나타냅니다; 즉, 데이터베이스 조회를하지 않거나 그렇지 않으면 인수 목록에 직접 존재하지 않는 정보를 사용합니다. 이 옵션이 주어지면, 모든 상수 인수를 가진 함수 호출은 함수 값으로 즉시 대체 될 수 있습니다.

+0

결과가 동일한 인수에 대해 변경되면 어떻게됩니까? – stefita

+0

@stefita : 당신은'IMMUTABLE'과 같은 기능을 표시하면 안됩니다. http://www.postgresql.org/docs/current/static/xfunc-volatility.html – Quassnoi

+0

@stefita : clock_timestamp()와 같은 뜻입니까? 그런 다음 VOLATILE이라고 선언하면 Postgres는 그것을 볼 때마다 호출합니다. 그 밖의 무엇을 할 수 있을까요? 하지만 함수 (id)가 같은 것을 반환하지만 3 개의 다른 필드를 선택해야합니다. –

2

사용 하위 쿼리 :

SELECT foo, bar, result 
FROM (
SELECT ..., function(id) AS result 
.... 
) as tmp 
1

당신은 같은 일부 펑키 튜플 일 사용할 수 있습니다 :

SELECT id, 
CASE WHEN function(id) > 0 
    THEN (field1, field3, field5) 
    ELSE (field2, field4, field6) 
END as (value1, value2, value3) 

을하지만 함수의 언어 무엇 구문