2016-04-09 60 views
0

我想要实现搜索过滤器此表:测试对于SQL查询里面空

CREATE TABLE ACCOUNT(
ID INTEGER NOT NULL, 
USER_NAME TEXT, 
PASSWD TEXT, 
FIRST_NAME TEXT, 
LAST_NAME TEXT, 
LAST_LOGIN DATE, 
DATE_REGISTERED DATE, 
ROLE INTEGER, 
CAN_LOGIN INTEGER 
) 
; 

-- ADD KEYS FOR TABLE ACCOUNT 

ALTER TABLE ACCOUNT ADD CONSTRAINT KEY1 PRIMARY KEY (ID) 
; 


SELECT * FROM ACCOUNT 
WHERE '" + searchString + "' IN (ID, USER_NAME, FIRST_NAME, LAST_NAME) 
ORDER BY %S %S offset ? limit ?; 

但是,当我有空搜索过滤器我得到这个错误:

org.postgresql.util.PSQLException: ERROR: invalid input syntax for integer: "null" Position: 30 

我如何可以编辑SQL查询的方式,如果searchString为空,WHERE子句将被跳过?

这里是Java方法:

public List<AccountsObj> list(int firstRow, int rowCount, String sortField, boolean sortAscending) throws SQLException 
    { 
     String SqlStatement = null; 

     if (ds == null) 
     { 
      throw new SQLException(); 
     } 

     Connection conn = ds.getConnection(); 
     if (conn == null) 
     { 
      throw new SQLException(); 
     } 

     String sortDirection = sortAscending ? "ASC" : "DESC"; 

     SqlStatement = "SELECT * FROM ACCOUNT " 
      + " WHERE '" + searchString + "' IN (ID, USER_NAME, FIRST_NAME, LAST_NAME)" 
      + " ORDER BY %S %S offset ? limit ? "; 

     String sql = String.format(SqlStatement, sortField, sortDirection); 

     PreparedStatement ps = null; 
     ResultSet resultSet = null; 
     List<AccountsObj> resultList = new ArrayList<>(); 

     try 
     { 
      conn.setAutoCommit(false); 
      boolean committed = false; 

      ps = conn.prepareStatement(sql); 
      ps.setInt(1, firstRow); 
      ps.setInt(2, rowCount); 

      resultSet = ps.executeQuery(); 
      resultList = ProcessorArrayList(resultSet); 

      conn.commit(); 
      committed = true; 

     } 
     finally 
     { 
      ps.close(); 
      conn.close(); 
     } 

     return resultList; 
    } 
+0

无论你做什么只是停下来一会儿。你的查询看起来很奇怪。在你的应用层中,你可能有:1.串连接2.参数绑定3.串取代。如果用户提供'searchString'会怎么评论其余的查询和'DROP DATABASE'呢? – lad2025

+0

无论如何它可能是重复的:http://stackoverflow.com/questions/36519762/search-in-postgresql-table – lad2025

+0

这是一个类似的,但问题是不同的。 –

回答

1

使用SQL检查null您可以执行的搜索字符串:

SELECT * FROM account WHERE ? IS NULL OR ? IN (user_name, first_name, last_name) 

这里? IS NULL会短路,如果参数是NULL而第二部分将不会被评估。

请注意,我用了两个参数绑定具有相同的值(搜索字符串),这里的ID柱消失了 - 你不能IN子句中混合varcharinteger

编辑对于通配符搜索,您可以使用LIKEILIKE(不区分大小写搜索)

SELECT * FROM account WHERE 
    (trim(?) = '') IS NOT FALSE 
    OR user_name like ? 
    OR first_name like ? 
    OR last_name like ? 

使用事先准备好的声明,你会这样称呼它(请注意,您必须将相同的参数绑定四次)

try (PreparedStatement ps = conn.prepareStatement(sql)) { 

    ps.setString(1, searchString); 
    ps.setString(2, searchString); 
    ps.setString(3, searchString); 
    ps.setString(4, searchString); 

    try (ResultSet rs = ps.executeQuery()) { 
     // read data 
    } 
} 
+0

谢谢,我如何添加通配符?例如,我想搜索部分字符串'%value%' –

+0

@Peter Penzov最简单的方法是使用“like”或“ilike”(不区分大小写),例如“哪里? IS NULL或user_name像? OR first_name喜欢? OR last_name like?' – nyname00

+0

此外,你可以去全文搜索,看到这里http://www.postgresql.org/docs/current/interactive/textsearch-tables.html#TEXTSEARCH-TABLES-SEARCH – nyname00

0

可以替换这行的Java代码:

+ (searchString == null || searchString.length == 0) ? "" : (" WHERE '" + searchString + "' IN (ID, USER_NAME, FIRST_NAME, LAST_NAME)") 

它基本上检查,如果搜索字符串是空的,并增加了只有当它是行不是

+0

我得到不兼容的类型:字符串不能转换为布尔型 –

+0

请问您可以粘贴完整的代码提议吗? –

+0

我已经编辑它来修复它 –