2011-09-12 10 views
6

bu basit yöntemi düşünün: örnek yöntemi bir sütunun değeri maçları, basit olmalıdır bazı tablodan her şeyi seçmek gerekiyorduNULL ve normal değerler farklı hazırlanmış ifadeler kullanılmadan nasıl işlenebilir?

public ResultSet getByOwnerId(final Connection connection, final Integer id) throws SQLException { 
    PreparedStatement statement = connection.prepareStatement("SELECT * FROM MyTable WHERE MyColumn = ?"); 
    statement.setObject(1, id); 
    return statement.executeQuery(); 
} 

. Çirkin ayrıntı, kimliği için NULL geçerek boş bir ResultSet sonuçlanır, DB kaç tane satır var olursa olsun, SQL NULL, null değil, null değil, anyaling değil, NULL tanımlar. fıkra nerede farklı kullanıyor bildiğim bu satırları seçmek için tek yol: Maalesef

SELECT * FROM MyTable WHERE MyColumn IS NULL 

tek yolu her durumda düzgün yöntem çalışması için bir, iki tamamen farklı bir yürütme pathes var gibi görünüyor id argümanının null olduğu ve normal değerler için olduğu durum için.

Bu çok çirkindir ve null olabilecek birden fazla sütuna sahip olduğunuzda çok hızlı bir şekilde dağınık olabilir. Aynı kod yolu/deyimiyle NULL ve normal değerler nasıl işlenebilir?

+0

JDBC kullanmayın, ancak '='/'NULL' dinamik olarak seçildiğinden IS böylece C# genellikle Bunu ayarlamak?. Varsa, parametre, hazırlanan deyimle hala bağlanır. –

+0

SQL Server kullanıyorsanız, sadece “ANSI_NULLS OFF” ve “field = NULL” komutlarını kullanabilirsiniz. – NullUserException

+1

Hazırda Beklet veya JPA'yı düşünün. Sizi JDBC boilerplate'den koruyacak. – BalusC

cevap

0

Böyle bir sorgu kullanabilirsiniz:

select * from MyTable where 
    case when ?1 is null then MyColumn is null else MyColumn = ?1 

Ama aynı parametre yeniden kullanır, bu yüzden sözdizimi ben çalışacak önerdiğimiz mı bilmiyorum (1?).

2

Bunu denemedim ama preparedStatements için boş değerlere gönderme yolu SetNull() seçenekle

PreparedStatement statement = connection.prepareStatement("SELECT * FROM MyTable WHERE MyColumn = ?"); 
    if (id == null) 
     statement.setNull(1, java.sql.Types.INTEGER); 
    else  
     statement.setObject(1, id); 
    return statement.executeQuery(); 

DÜZENLEME kullanmaktır: tepkiler @Gabe ve @Vache için teşekkürler. Bunu yapmak için kolay bir yol var gibi görünmüyor. Böyle

şey çalışmalıdır -

String sql = " SELECT * FROM MyTable WHERE " + (id==null)?"MyColumn is null":"MyColumn = ?" ; 
     PreparedStatement statement = connection.prepareStatement(sql); 
     if (id != null) 
      statement.setObject(1, id); 
     return statement.executeQuery(); 
+0

ANSI SQL'de 'MyColumn = NULL ',' MyColumn '' NULL 'değerine sahip olsa bile asla doğru olmaz. – Gabe

+0

"SQL null" ayarlayacaktır, ancak 'MyColumn = NULL 'hala sonuç döndürmeyecektir. 'setNull' çoğunlukla ekleme sorguları için kullanılır. – Vache