2016-04-09 7 views
0

I Suchfilter für diese Tabelle implementieren möchten:Prüfung auf null innerhalb SQL-Abfrage

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 ?; 

Aber wenn ich leer Suchfilter haben bekomme ich diesen Fehler:

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

Wie kann ich das bearbeiten SQL-Abfrage in einer Weise, dass WHERE-Klausel übersprungen wird, wenn SearchString leer ist? Hier

ist die Java-Methode:

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

Was auch immer Sie tun, halten Sie einfach für einen Moment an. Ihre Anfrage sieht sehr merkwürdig aus. In Ihrer Anwendungsebene haben Sie wahrscheinlich: 1.string Verkettung 2. Parameter Binding 3. String-Substitution. Was ist, wenn der Benutzer 'searchString' bereitstellt, der den Rest der Abfrage und' DROP DATABASE' kommentiert? – lad2025

+0

Jedenfalls ist es wahrscheinlich ein Duplikat von: http://stackoverflow.com/questions/36519762/search-in-postgresql-table – lad2025

+0

Es ist eine ähnliche, aber das Problem ist anders. –

Antwort

1

SQL für einen null Suchtext zu überprüfen verwenden, können Sie tun:

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

Hier wird ? IS NULL kurzgeschlossen, wenn der Parameter NULL ist und der zweite Teil nicht ausgewertet wird.

Bitte beachte, dass ich zwei Parameterbindungen mit dem gleichen Wert verwendet haben (Suche string) hier und dass die ID Säule gegangen ist - man kann nicht varchar und integer in der IN Klausel mischen.

bearbeiten Für Wildcard Durchsuchungen Sie LIKE oder ILIKE (für Groß- und Kleinschreibung Suche)

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

Mit einer vorbereiteten Anweisung verwenden, können Sie es so nennen würde (beachten Sie, dass Sie die gleichen Parameter binden viermal)

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

Danke, wie kann ich Platzhalterzeichen hinzufügen?Zum Beispiel würde ich gerne einen Teil einer Zeichenkette suchen% valuation% –

+0

@Peter Penzov Der direkte Weg zu gehen wäre, zu verwenden wie "like" oder "ilike" (case-insensitive), z. 'WO? IS NULL ODER Benutzername wie? ODER Vornamen wie? ODER last_name wie? ' – nyname00

+0

Sie könnten auch für die Volltextsuche gehen, siehe hier http://www.postgresql.org/docs/current/interactive/textsearch-tables.html#TEXTSEARCH-TABLES-SEARCH – nyname00

0

Sie diese Zeile Ihres Java-Code ersetzen:

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

Es prüft im Grunde, wenn searchString- leer ist, und fügt die Zeile nur, wenn es nicht

+0

Ich bekomme inkompatible Typen: String kann nicht in Boolean konvertiert werden –

+0

Können Sie bitte den kompletten Codevorschlag einfügen? –

+0

Ich habe es bearbeitet, um es zu beheben –