在WHERE子句

时间:2016-11-03 08:24:17

标签: java postgresql jdbc

在使用Postgres JDBC时,我遇到了有关字符串查询的问题。以下查询正在使用Auqadata Studio等工具,但无法使用代码。

代码如下;

// strSqlStatement is passed from a framework as String like this and executed untouched
strSqlStatement = "SELECT columnA FROM abc.table1 WHERE columnB= '%KLMN%' limit 1;"; 
...
strDBUrl = "jdbc:postgresql://x.x.x.x:1234/instance?useUnicode=yes&characterEncoding=UTF-8";   
...
rs = st.executeQuery(strSqlStatement);

在Postgres数据库中,columnB as;

存在记录
... ColumnA    ...      ColumnB             ...   ColumnC
    -------             -------                   -------
    value1      |       TEST_AA_KLMN_BB_S     |      25
    value2      |       TEST2_AA_KLMN_BB_S    |      79
    value3      |       TEST3_AA_KLMN_BB_S    |     124

问题是这样的,通常用WHERE clause as ColumnB = 'TEST2_AA_KLMN_BB_S'查询value2应该可以工作,但这个简单的查询不起作用。另外LIKE条款ColumnB LIKE '%KLMN%'根本不起作用。

将其他列作为ColumnC用于WHERE子句时没有问题。

我检查过我们的Postgres数据库没有设置区域设置(lc_ctype = C),数据库的编码是UTF-8(server_encoding = UTF8)。

背景;

  • 此代码段存在于独立的可执行jar文件中。
  • ColumnB的数据类型是varchar(64)。
  • Java 1.7(也尝试使用1.8和1.6)。
  • JDBC是postgresql-9.4.1211.jre6(也尝试过7和8)。

修改 @Francisco Puga,我错误地写了WHERE columnB= '%KLMN%'有问题,它在实际代码中是正确的WHERE columnB LIKE '%KLMN%',但是,谢谢你的快速回复。

我已经缩小了问题范围。我发现=LIKE实际上正在发挥作用,但字符串存在限制问题。

如果比较字符串短于25个字符,一切都很好但是当比较字符串超过25个字符时,结果为空。实际上25个角色对我没有响铃。

1 个答案:

答案 0 :(得分:1)

不确定它是否是拼写错误,但你的where子句是:

WHERE columnB= '%KLMN%'

应该是:

WHERE columnB LIKE '%KLMN%'

如果你想忽略大写,甚至可以使用ILIKE

还要考虑到,如果在列名中使用大写,则在进行查询时应使用双引号(但如果这是问题,则应该抛出错误,而不是空记录集)

SELECT "ColumnA" FROM abc.table1 WHERE "ColumnB" ILIKE '%KLMN%' limit 1;