首页 > 解决方案 > jt400 将我的 where 条件截断为 like 子句

问题描述

jt400-9.3.jar用来连接 DB2/AS400。

我的表BAND有这个记录:

+-----|------------------+
| MAT |     NAME         |
+-----|------------------+
|100  | Paul McCartney   |
|101  | John Lennon      |
|102  | Ringo Starr      |
|103  | George Harrison  |

我的桌子MUSICIAN上有:

+------|------------------+
|MAT   |  NAME            |
+------|------------------+
|1001  | Pete Best        |
|1002  | Stuart Sutcliffe |
|1003  | Jimmy Nicol      |
|1004  | Tommy Moore      |
|1005  | Norman Chapman   |

当我运行这个选择

SELECT t.mt, t.name
FROM (      
    SELECT 
        trim(b.mat) AS mat, 
        trim(b.name) AS name
    FROM band b
    WHERE trim(b.mat) = '1001'
    UNION 
    SELECT 
        trim(m.mat) AS mat, 
        trim(m.name) AS name
    FROM MUSICIAN m
    WHERE trim(m.mat) = '1001'
) AS t
FETCH FIRST 1 ROWS ONLY

我检索:

+-----|----------------+
|MAT  |NAME            |
+-----|----------------+
|100  | Paul McCartney |

第一个查询作为like子句工作。与1001匹配100,但句子为=no like

当我在 dbeaver 中执行查询时,但在 java(使用 PreparedStatement)中我弄错了,驱动程序有一些配置吗?

标签: jt400

解决方案


约翰·埃伯哈德(John Eberhard)对我的问题回答得如此之快。

https://sourceforge.net/p/jt400/bugs/121/

注册您的答案。

问题是查询中使用了 =。因为在查询中使用了 =,所以数据库告诉驱动程序类型是 CHAR(5)。然后驱动程序截断为 char 5。

有两种可能的解决方案。

  1. 向参数标记添加强制转换,以便更大的字符适合和错误比较。即 SELECT * FROM MYTABLE WHERE MAT = CAST( ? AS VARCHAR(80))

  2. 使用“查询替换截断参数”JDBC 属性。请参阅https://static.javadoc.io/net.sf.jt400/jt400/9.7/com/ibm/as400/access/doc-files/JDBCProperties.html

这是该属性的定义方式。

“查询替换截断参数”

指定应该用来代替 SQL 查询的截断参数的值。默认情况下,参数被静默截断为参数的长度。考虑以下场景。

表 T1 有一个名为 C1 的 CHAR(3) 列,以及一个 C1='ABC' 的行。应用程序使用 SELECT * FROM TABLE_X where C1=? 如果参数设置为“ABCD”,它将被静默截断为“ABC”,并且查询将返回一行。

此属性通过允许应用程序将字符串设置为应用程序中不存在的内容(即@@@@@@@)来避免此问题。空白值意味着该属性将被忽略。


推荐阅读