2017-02-22 5 views
2

DB2/AS400에서 작동하지 못하는 쿼리가 있습니다.DB2 쿼리 함수가 매개 변수로 작동하지 않습니다.

select integer(score(ADRLIN1, :param1)*100) as RELEVANCEADR, 
ADRLIN1, PSTCOD from MYSCHEMA.MYTABLE 
where contains(ADRLIN1, :param2) = 1 
and pstcod like :param3 
order by RELEVANCEADR desc 

위의 쿼리를 실행하고 매개 변수에 값을 입력하려고하면 [SQL0418] 매개 변수 표식이 유효하지 않습니다.

큰 문제는 아닙니다. Google 검색은 매개 변수를 사용하기 전에 매개 변수를 작성하라는 메시지를 표시했습니다. 그래서 나는이에 쿼리를 변경 : 다음 값으로

select integer(score(ADRLIN1, CAST(:param1 AS CHAR))*100) as RELEVANCEADR, 
ADRLIN1, PSTCOD from MYSCHEMA.MYTABLE 
where contains(ADRLIN1, CAST(:param2 AS CHAR)) = 1 
and pstcod like :param3 order by RELEVANCEADR desc 

:

  • PARAM1

    -> 19 EDGEWOOD BLVD
  • PARAM2 -> 19 EDGEWOOD BLVD
  • 3 당겨 - > % 68046 %

그리고 결과가 비어 있습니다. , 실제로 리터럴로 쿼리를 채우면 쿼리가 작동합니다.

select integer(score(ADRLIN1, '19 EDGEWOOD BLVD')*100) as RELEVANCEADR, 
ADRLIN1, PSTCOD from MYSCHEMA.MYTABLE 
where contains(ADRLIN1, '19 EDGEWOOD BLVD') = 1 
and pstcod like '%68046%' 
order by RELEVANCEADR desc 

위의 쿼리는 유효한 레코드를 반환합니다.

제 질문은 어떻게 점수를 얻을 수 있으며 하드 코딩 된 문자열 대신 매개 변수로 전달할 작업 기능이 포함되어 있습니까?

+0

코드에'param1'과'param2'가 있습니다. 둘 모두에 동일한 문자열을 전달하고 있습니까? –

+0

@GordonLinoff 예, 'param2'를 'param1'로 바꾸어도 동일한 문자열이 전달되도록하더라도 결과 집합은 비어 있습니다. – ThatGuyYouKnow

+3

'CHAR'은'CHAR (1)'과 동일하므로 모든 입력 값이 잘립니다. 전송할 때 실제 데이터 유형을 사용하십시오. – mustaccio

답변

0

@Mustaccio가 의견에서 지적한대로 CHAR의 캐스팅은 CHAR(1)과 같습니다. 나는 이것을 수정하여 실제 길이를 선언하고 쿼리가 작동하고있다.