2013-10-03 5 views
1

У меня есть 3 переменные, значения которых вставляются пользователем.Таблица запроса, когда переменная может быть нулевой

Мне нужно запросить таблицу с 3 столбцами и если один из переменных имеет значение null, чтобы не выполнять запрос.

Как мне это сделать без if-else?

String par1= request.getParameter("par1"); 
String par2= request.getParameter("par2"); 
String par3= request.getParameter("par3 "); 

String query = "select * from table t " + 
       "where t.var1 = ? " + 
        "and t.var2" + 
        "and t.var3= ? "; 

Connection conn = DataBase.getConnection(); 
PreparedStatement s = conn.prepareStatement(query); 
s.setString(1, par1); 
s.setString(2, par2); 
s.setString(3, par3); 

EDIT - позвольте мне быть более ясным

no

Я хочу сделать запрос поиска, в котором пользователь может выбрать, какие поля для заполнения (некоторые из них могут остаться пустыми).

Что это за прощание?

+1

Что случилось с 'null' в' if'? –

+0

Вы хотите проверить состояние без использования условного? Зачем? – tom

+0

Что не так в инструкции if-else здесь? Какова ваша причина не использовать его? – user65439

ответ

1

Я не вижу пути вокруг условных обозначений здесь. Вам нужно использовать StringBuilder вместе с блоками if-else, чтобы динамически создавать запрос SELECT.

String par1 = "par1"; // intialized for testing 
String par2 = null; 
String par3 = "par3"; 

StringBuilder query = new StringBuilder("select * from table t"); 

if (par1 != null || par2 != null || par3 != null) { 
    query.append(" where "); 
    if (par1 != null) { 
     query.append("t.var1 = ?"); 
    } 
    if (par2 != null) { 
     if (par1 != null) { 
      query.append(" AND "); 
     } 
     query.append("t.var2 = ?"); 
    } 
    if (par3 != null) { 
     if (par1 != null || par2 != null) { 
      query.append(" AND "); 
     } 
     query.append("t.var3 = ?"); 
    } 
} 

System.out.println(query); 

Выход:

select * from table t where t.var1 = ? AND t.var3 = ? 

Пожалуйста, обратите внимание, что вы должны связать свои значения заполнителей условно тоже.

Connection conn = DataBase.getConnection(); 
PreparedStatement s = conn.prepareStatement(query.toString()); 

if (par1 != null || par2 != null || par3 != null) { 
    int n = 1; 
    if (par1 != null) { 
     s.setString(n++, par1); 
    } 
    if (par2 != null) { 
     s.setString(n++, par2); 
    } 
    if (par3 != null) { 
     s.setString(n, par3); 
    } 
} 
+0

кажется, что должен быть лучший способ, но это должно работать, я попробую. – susparsy

+0

Yea Точно, меня беспокоила связанная часть, но она отлично работает. – susparsy

+1

@susparsy Рад помочь спариться :) –

1

Пользователь троичный оператор http://en.wikipedia.org/wiki/%3F:

Пример кода:

String x = null; 
String y = x!=null ? "Its not null" : "It is null" 

Ваш код

String par1= request.getParameter("par1")==null? "" : 
               request.getParameter("par1"); 
+0

, но опять же, в этой ситуации я все равно буду запрашивать, если t.var = "", и это не то, что мне нужно. – susparsy

+1

@susparsy, тогда я думаю, что выхода нет. Я не понимаю, почему бы не использовать 'IF'. Потому что он изобрел только для этой цели. –

+0

Это просто скрытый if ... :) – ppeterka

0

При использовании уродства считается, что "без если-иначе":

String[] fields = {"par1","par2","par3"}; 

String query = "SELECT * FROM TABLE t "; 
String where = ""; 

String[] whereString = new String[]{" WHERE ", " AND "}; 

int whereAddress = 0; 

List<String> valuesAsParameters = new ArrayList<String>(); 

for(String fieldName : fields) { 
    String value = request.getParameter(fieldName); 

    //do we need WHERE or AND? 
    where += whereString[whereAddress]; 
    whereAddress=1; //change state 

    where += fieldName; 


    //should not EVER use exception for control flow... Outside of assignments, that is 
    try { 
    //throws NPE **on purpose**... Yuck!!! 
    valuesAsParameters.add(value.toString()); 
    // to check emptiness of string, we could use value.charAt(0) for the same purpose 
    where += " = ? "; 
    } catch(NullPointerException e) { 
    // EEEEEEKKKK! No, please really, don't do stuff like this... 
    // I shall burn in hell for even 
    // thinking about 
    //  **thinking about** 
    //   ****thinking about**** 
    // something this unexplainably, and universally bad... 
    where += " IS NULL "; 
    } 

} 

Connection conn = DataBase.getConnection(); 
PreparedStatement s = conn.prepareStatement(query); 
int i=1; 
for(String value : valuesAsParameters) { 
    s.setString(i++, value); 
} 

Простите, мне нужно теперь рвать и рвать ... Этот код - это чистое зло. Здесь будут драконы Не делайте это дома. И по Главная Я имею в виду известные и не известных частей Вселенной тоже. В том числе неизвестных размеров, места, которые не существуют, и даже мечты ... Я думаюя уже rted нормативыт о см wobbbly й Ings ...

EDIT

Хорошо, теперь намного лучше. Тем не менее, код выше не делает то, что хочет OP, хотя легко адаптировать его к этому. То, что это делает, использует предложение IS NULL для нулевых значений, как в SQL, то есть способ сравнения чего-то с null.

0

Как насчет привязки подстановочных знаков, когда параметры равны нулю? Это фактически исключало бы их из запроса без необходимости создания запроса с помощью StringBuilder, а затем отслеживать, как вы привязываетесь.

String query = "select * from table t " + 
       "where t.var1 like ? " + 
        "and t.var2 like ?" + 
        "and t.var3 like ? "; 

Connection conn = DataBase.getConnection(); 
PreparedStatement s = conn.prepareStatement(query); 
s.setString(1, par1 != null ? par1 : "%"); 
s.setString(2, par2 != null ? par2 : "%"); 
s.setString(3, par3 != null ? par3 : "%"); 
+0

интересно, я об этом, я должен попробовать это – susparsy

Смежные вопросы