2017-04-11 1 views
0

SQL 서버 기능 convert과 동일한 Postgres 기능이 필요합니다. 내가 함수 select convert('int','1',0)로 함수를 호출하는 동안Postgresql SQL Server 기능에 해당하는 변환

CREATE OR REPLACE FUNCTION convert (target VARCHAR(50),source ANYELEMENT,style INT) RETURNS ANYELEMENT 
    AS 
    $$ BEGIN 
    CASE 
    when style=0 then CASE 
    WHEN target ='int' THEN return source::int; 
    WHEN target ='smallint' or target = 'tinyint' THEN return source::smallint; 
    WHEN target ='bigint' THEN return source::bigint; 
    WHEN target ='numeric' or target = 'real' or target = 'float' THEN return source::double precision; 
    WHEN target ='smallmoney' or target = 'money' or target = 'decimal' THEN return source::double precision; 
    WHEN target ='char' THEN return source::char; 
    WHEN target ='datetime' or target = 'smalldatetime' then return source::timestamp; 
    WHEN target like 'varchar%' or target like 'nvarchar%' THEN return source::varchar; 
    WHEN target = 'text' or target like 'ntext' THEN return source::text; 
    WHEN target = 'timestamp' THEN return source::varchar(30); 
    WHEN target = 'binary' or target='varbinary' THEN return source::bytea; 
    WHEN target = 'uniqueidentifier' THEN return source::varchar(37); 
    WHEN target = 'sysname' THEN return source::varchar(128); 
    WHEN target = 'sql_variant' THEN return varchar; 
    WHEN target = 'bit' THEN if source::varchar='1' THEN return true; ELSIF source::varchar='0' THEN return false; else RAISE EXCEPTION 'Invalid value for Input boolean'; END IF; 
    ELSE return source::anyelement; 
END CASE; 
    when style!=0 then CASE 
    WHEN (style = 0 OR style = 100) THEN return to_timestamp(source::text,'mon dd yyyy hh:miAM'); 
     WHEN style = 1 THEN return to_timestamp(source::text,'mm/dd/yy'); 
     WHEN style = 101 THEN return to_timestamp(source::text,'mm/dd/yyyy'); 
     .. 
    .. 
END CASE; 
END CASE; 
    END; 
$$ LANGUAGE plpgsql; 

를 작성 결국, 다음과 같은 오류가 발생합니다 :

"ERROR: could not determine polymorphic type because input has type "unknown" 1 statement failed."

내가 변환 ('INT'로 두 번째 매개 변수의 명시 적 캐스팅을 수행 할 때 ' 1 ':: text, 0), 작동합니다. 하지만 추가 캐스팅을하지 않고 전화해야합니다. 누군가 도울 수 있습니까?

+1

정확히 MS-SQL Server의'convert' 함수가 복제하려고하는 것이 무엇이며, 왜 필요합니까? –

+2

필요시'to_char' /'to_timestamp' 옵션과 함께'CAST'를 사용하지 않는 것이 어떨까요? - ''1 ''문자가 unknown (https://www.postgresql.org/message-id/183.1302200970%40sss.pgh.pa.us) 타입이기 때문에 원하는 것은 PostgreSQL에서 작동하지 않습니다. 항상 유형 정보를 제공해야합니다. 형식화 된 리터럴 구문'int '1' 또는 캐스트''1 ':: int' 또는'CAST ('1 'AS int)'중 하나입니다. 준비된 명령문을 사용하고 바인딩을 통해 유형 정보를 제공하면 (어쨌든해야 함) 캐스트를 사용할 필요가 없습니다. – pozs

답변

0

PostgreSQL 파서를 변경하지 않고 convert과 같은 기능을 작성할 수 없습니다. 대신 PostgreSQL cast 함수를 사용하십시오. anyelement은 템플릿과 유사하며 입력시 anyelementint 인 경우 출력시 anyelementint이됩니다. 이것은 당신이 원하는 것이 아닙니다.

PostgreSQL에서는 함수 내에서 결과 유형을 선택할 때 함수를 작성할 수 없습니다. 결과 유형은 함수를 호출하기 전에 알아야합니다. 그리고 PostgreSQL은 함수에 대해 아무것도 알지 못하므로 필요한 결과 유형을 선택할 수 없습니다.

관련 문제