2014-03-03 4 views
0

현재 테이블의 3 개 필드를 단일 문자열로 연결하는 중입니다. 이 세 필드는 다른 데이터 유형입니다.Db2의 데이터 형식 변환

Select 
    CASE COALESCE(CHAR_COLUMN,'XXX') WHEN 'XXX' 
     THEN 'CHAR_COLUMN is null' 
    else 'CHAR_COLUMN='''||CHAR_COLUMN||'''' END 
    ||' and '|| 
    CASE COALESCE(DT_COLUMN,TIMESTAMP('1980-01-01-00.00.00')) 
     WHEN TIMESTAMP('1980-01-01-00.00.00') THEN 'DT_COLUMN is null' 
    else 'DT_COLUMN='''||DT_COLUMN||'''' END 
    ||' and '|| 
    CASE COALESCE(NUM_COLUMN,111) WHEN 111 
     THEN 'NUM_COLUMN is null' 
    else 'NUM_COLUMN='''||NUM_COLUMN||'''' END 
from 
S_DATATABLE 

이 완벽하게 DB2/AIX64 9.1.7에서 미세하지만 DB2 z/OS 10.1.5에서 작동합니다. 이 DB2 버전 수행해야 어떤 변화 제안하십시오 날짜 열 별도로

SQL0171N The data type, length or value of the argument for the parameter in position "2" of routine "||" is incorrect. Parameter name: "||". SQLSTATE=42815  

을 실행할 때
오류
때 숫자 열

An unexpected token ",111" was found following ",111". Expected tokens may include: "CONCAT ||/MICROSECONDS MICROSECOND SECONDS SECOND MINUTES". SQLSTATE=42601 

에 대해 개별적으로 달렸다. 미리 감사드립니다.

+0

진술은 양쪽 시스템에서 모두 똑같습니까? 오류 메시지는 아포스트로피 누락과 같은 구문의 차이를 나타냅니다. – WarrenT

답변

4

우선 DB2 버전 연결에 관계없이 문자 피연산자가 필요합니다. 문자열과 정수를 결합 할 수 없습니다. DB2는 비 문자 데이터 유형을 내재적으로 문자로 변환하려고 시도합니다. 오류를 피하기 위해 명시 적 변환을 수행하는 것이 가장 좋습니다.

둘째, SQL이 불필요하게 복잡해 보입니다. 대신

CASE COALESCE(NUM_COLUMN,111) 
    WHEN 111 
     THEN 'NUM_COLUMN is null' 
    else 'NUM_COLUMN='''||NUM_COLUMN||'''' 
END 

의 당신은 간단하게이 작업을 수행 할 수 있습니다

CASE WHEN NUM_COLUMN IS NULL 
     THEN 'NUM_COLUMN is null' 
    ELSE 'NUM_COLUMN='||VARCHAR(NUM_COLUMN) 
END 

참고 원래 코드에서 당신은 또한 암시 적 변환의 원인이됩니다 리터럴 문자로 NUM_COLUMN을 비교하는 것이다. 모든 DB2 플랫폼이 모든 데이터 유형 간의 암시 적 변환을 지원하는 것은 아니므로 다시 사용하지 말고 명시 적 변환을 사용하십시오.

+0

귀하의 요지를 이해합니다. 암시 적 변환은 하나의 DB2 버전에서 제대로 작동했지만 다른 버전에서는 제대로 작동하지 않았습니다. 이제 당신이 제안한대로 필요에 따라 명시 적 변환을하도록 코드를 변경했습니다. 지금은 잘 작동하고 있습니다. 감사. – user2223335