2012-01-10 2 views
4

IB Datapump를 사용하여 BDE 테이블 (소스)을 Firebird 테이블 (대상)으로 변환하기 위해 insert 문을 사용하고 있습니다. 따라서 INSERT 문은 매개 변수를 통해 소스 테이블 값에 의해 제공됩니다. 소스 필드 매개 변수 중 하나는 alphanum (SOURCECHAR10 char(10)이며 대부분 정수를 포함하며 (정수 유형) 대상 열 NEWINTFLD에서 정수로 변환해야합니다. SOURCECHAR10이 숫자가 아니면 NEWINTFLD에 0을 지정하고 싶습니다.IIF와 비슷한 것을 사용하여 INSERT에서 숯을 정수로 변환

내가 IIF를 사용하고 SIMILAR 문자열이 숫자인지 테스트, 및 숫자하지 않을 경우 다음과 같이 0을 할당합니다 :

INSERT INTO "DEST_TABLE" (......, "NEWINTFLD",.....)   
VALUES(..., IIF(:"SOURCECHAR10" SIMILAR TO '[[:DIGIT:]]*', :"SOURCECHAR10", 0),..) 

를 모든 숫자가 아닌 문자열이 들어 있지만, 난 아직도 변환 오류 (DSQL error code = -303)를 얻을.

나는 SOURCECHAR10" SIMILAR TO '[[:DIGIT:]]*', 1, 0) 같은 IIF 결과 필드에 상수 만 테스트하고 그래서 어떻게 든 잘 작동 : SOURCECHAR10IIF의 진정한 결과 필드에 오류가 발생합니다. 아이디어를 얻는 방법에 대한 아이디어가 있으십니까?

+0

true로 평가 될 때 외부 캐스트를 적용, 당신이있어 적용되어있는 VARCHAR 같은 얘기들이었다 값이 숫자로 시작하는지 테스트합니다. 나중에 숫자로 시작하지만 나중에 숫자가 아닌 값을 갖는 값이 있습니까? – MatBailie

+0

예,있을 수 있습니다. 그러나 afaik [[: DIGIT :]] *는 http://www.firebirdsql.org/file/documentation/reference_manuals/reference_material/html/langrefupd25-similar-to.html을 보면 '임의의 자리수'를 의미합니다. –

답변

1

쿼리가 실행되면 파서는 :"SOURCECHAR10"의 두 번째 사용이 정수가 예상되는 곳에서 사용됨을 알게됩니다. 따라서 문자열이 정수가 아닌 경우 SOURCECHAR10이 사용되지 않아도 SOURCECHAR10의 내용을 항상 해당 위치의 정수로 변환합니다.

실제로 Firebird는 :"SOURCECHAR10"을 매개 변수로 사용하지 않지만 연결 라이브러리는이를 두 개의 개별 매개 변수 자리 표시 자 ?으로 변환하며 두 번째 자리 표시 자 유형은 INTEGER입니다. 따라서 실제 쿼리가 실행되기 전에 변환이 발생합니다.

이 솔루션은 아마 (내가 구문 오류가 포함될 수 있습니다, 그것을 테스트하지 않았다) (참고 : 올바른 솔루션을위한 두 번째 예제 참조) 같은 것을 사용하는이하지 않는

CASE 
    WHEN :"SOURCECHAR10" SIMILAR TO '[[:DIGIT:]]*' 
     THEN CAST(:"SOURCECHAR10" AS INTEGER) 
    ELSE 0 
END 

을 이 같은 작업은 문제가 해결되지 않으면 매개 변수가 제대로 확인 시험 당신이 또한 확인 :"SOURCECHAR10" 주위 VARCHAR에 대한 명시 적 캐스트를 추가하려고 수 CAST() item 'Casting input fields'

를 참조 매개 변수 자체의 캐스트로 해석됩니다

CASE 
    WHEN :"SOURCECHAR10" SIMILAR TO '[[:DIGIT:]]*' 
     THEN CAST(CAST(:"SOURCECHAR10" AS VARCHAR(10) AS INTEGER) 
    ELSE 0 
END 

여기 내부 캐스트 매개 변수 자체가, 내가 제대로 숙지 경우 CASE 표현식이

+0

감사합니다. 많이. 명시 적 캐스트가 포함 된 두 번째 솔루션이 효과가있었습니다! (첫 번째는 여전히 오류를 주었다) –

+0

@WilfriedVisser 나는 첫 번째 문제가 똑같은 문제가있을 것이라고 확신했지만 확실하지는 않았다. 두 번째 작품을 듣고 반갑습니다. 제 대답을 받아 들일 수 있습니까? –

+0

@WilfriedVisser - 첫 번째 실패한 경우 INT 한계를 초과하는 값을 가질 수 있습니다. 파이어 버드에는 사용할 수있는 BIGINT 변형이 있습니까? – MatBailie