次の省略形式のSQLforDB2があります。
Select ...
From ...
Where ... ((COL1 IS NULL) And ('' = ?)) ...
Order By ...
このSQLの大まかな目的は、COL1に対する入力が空白の場合にNullレコードを返すことです。
ただし、「RED」をプレースホルダーにバインドしようとすると、「文字列データの右切り捨て」を示すCLI0109Eエラーが発生します。何が起こっているのかというと、DB2はSQLの''リテラルが長さ0の列であると判断したため、長さ3('RED'の場合)のバインドされたパラメーターを比較しようとすると、切り捨てエラーが発生します。これは理にかなっています。
SQLを:に変更すると、正常に((COL1 IS NULL) And ('{10 spaces}' = ?))
機能します。
SQLを:に変更すると、正常に((COL1 IS NULL) And (CAST('' AS VARCHAR(32767)) = ?))
機能します。
DB2が''を長さゼロの列として解釈する原因となっているドライバー設定、または欠落しているSQLBindParameters設定はありますか?
私はOracleとSQLServerを介して同じSQLを実行し、それらは正常に動作します。これは、''を別のものとして解釈し、デフォルトでSQL内のすべてのリテラルをVARCHAR(32767)などとして処理することを示しています。
助けてくれてありがとう。