2016-04-09 15 views
0

SQL sorgusunun içine null:Testi Bu tablo için arama filtresini uygulamak istediğiniz

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

Ama boş arama filtresini olduğunda bu hatayı alıyorum:

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

ı düzenleyebilir nasıl SQL sorgusu, searchString boşsa WHERE yan tümcesi atlanacak şekilde mi? Eğer java kod satırını yerini alabilir

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

Ne yaparsanız yapın sadece bir an için durun. Sorgunuz çok garip görünüyor. Uygulama katmanınızda muhtemelen var: 1.string birleştirme 2. parametre bağlama 3. dize substution. Kullanıcı sorguyu ve "DROP DATABASE" ifadesinin geri kalanını yorumlayan "searchString" sağlarsa ne olur? – lad2025

+0

Her halükarda muhtemelen bir kopyası: http://stackoverflow.com/questions/36519762/search-in-postgresql-table – lad2025

+0

Benzer ama sorun farklı. –

cevap

1

yapabileceğiniz:

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

NULL parametresi ? IS NULL kısa devre yapacak ve ikinci bölüm değerlendirilmeyecektir. Eğer IN fıkrada varchar ve integer karıştırmak olamaz -, ben burada aynı değere (arama dizesi) ile iki parametre bağlamaları kullandım ve ID sütun gittiğine göre

Not. joker için

Düzenleme Eğer aynı parametreyi bağlamak zorunda olduğuna dikkat bu (gibi çağırır hazırlanmış deyimi kullanarak LIKE veya ILIKE (küçük harfe duyarlı aramalar için)

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

kullanabilirsiniz arar dört kez)

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

Teşekkürler Joker karakterini nasıl ekleyebilirim?Örneğin, '% valu%' dizgisinin bir parçasını aramak istiyorum. –

+0

@Peter Penzov Gitmenin en basit yolu, 'like' veya 'ilike' (case-insensitive), ör. NEREDE? NULL VEYA kullanıcı_adı nasıl? VEYA first_name gibi? OR last_name gibi? ' – nyname00

+0

Ayrıca, tam metin arama için de gidebilir, buraya bakın http://www.postgresql.org/docs/current/interactive/textsearch-tables.html#TEXTSEARCH-TABLES-SEARCH – nyname00

0

: Burada

Java yöntemidir searchString boş olduğunu ve yalnızca çizgi eklerse

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

Temelde denetler değil null arama dizesi kontrol etmek için SQL kullanarak

+0

Uyumsuz türler alıyorum: String, boolean'a dönüştürülemiyor –

+0

Tam kod önerisini yapıştırabilir misiniz lütfen? –

+0

Ben düzeltmek için bu düzeltilmiş –

İlgili konular