2016-04-18 56 views
0

私は1つのsqlクエリの修正を行って、case文にequalとequal以下のwhere節を含めるようにしていますが、 < =トークンが有効でないというエラーメッセージが表示されます。私は両方のHTMLコードとしてシンボルを試して、CDATA括弧で囲まれて、同じエラーが発生します。 Mybatisキューは以下の通りです。MyBatisのエラーが等号よりも小さい、等号より大きい

WHERE A.WDATE BETWEEN #{fdate} AND #{tdate} 
    AND A.FAC LIKE #{fac} 

    <if test = 'good != "%"'> 
     AND SUBSTR(A.ITDSC,21,4) NOT LIKE #{good} 
    </if> 
    <if test = 'size != ""'> 
     AND CASE WHEN #{size} = '16' THEN SUBSTR(A.ITDSC,13,2) &lt;= '16' ELSE SUBSTR(A.ITDSC,13,2) &gt;= '17' END 
    </if> 
+0

コア問題にクエリを削減し、読みやすい、それをフォーマットお願いします。 –

+0

これからどうすればいいですか – Demilich1988

+0

あなたはどのRDBMSを使用していますか? – nyname00

答えて

1

多分動作し、これを試してみてください。&lt;=&gt;=<=>=をエスケープ)

WHERE A.WDATE BETWEEN #{fdate} AND #{tdate} 
AND A.FAC LIKE #{fac} 

<if test = 'good != "%"'> 
AND SUBSTR(A.ITDSC,21,4) NOT LIKE #{good} 
</if> 
<if test = 'size != ""'> 
AND ((#{size} = '16' AND SUBSTR(A.ITDSC,13,2) &lt;= '16') OR SUBSTR(A.ITDSC,13,2) &gt;= '17') 
</if> 
+0

エラーを修正することを提案しましたが、別のエラーが発生しました。これはメッセージです:java.lang.ClassCastException:java.lang.Stringにjava.lang.Integerにキャストできません – Demilich1988

+0

@ Demilich1988このエラーはDAOレイヤーコードを実行することによって発生しますか? – Blank

+0

@ Demilich1988または、Mybatisの結果セットがエンティティにマップされ、クエリコードで 'String'が' Integer'にキャストされた場合、この例外が発生しました。私は思った;) – Blank

0

はOKに見えると私のために動作します。

しかし、WHERE句

AND 
    CASE 
    WHEN #{size} = '16' THEN SUBSTR(A.ITDSC,13,2) &lt;= '16' 
    ELSE SUBSTR(A.ITDSC,13,2) &gt;= '17' 
    END 

の一部は疑わしいです。

DB2CASEは、式の一部でなければならない。

WHERE xyz >= CASE WHEN ... THEN ... END 

または

WHERE 
    (CASE WHEN ... THEN ... ELSE ... END) >= xyz 

詳細と例についてはcase-expressionsを参照してください。

+0

私はあなたの方法を試しましたが、記号が有効ではないことについて、私に同じエラーメッセージを送ってくれました。 – Demilich1988

0

私はIFサイズにサイズ1のための文が==「16」と他のサイズのための2つを使用して問題を解決することができました==「17」

関連する問題