2016-04-09 98 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

我已經編輯它來修復它 –