2017-02-22 15 views
2

DB2/AS400で動作することができないクエリがあります。DB2 Query関数がパラメータで機能しない

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
  • param3 - >%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)に相当します。これを修正して実際の長さを宣言し、クエリが機能しています。

関連する問題