SQLite / Выбор строк из таблицы ГДЕ столбец = НИЧЕГО - PullRequest
0 голосов
/ 28 апреля 2018

В Android SQLite у меня есть таблица: TABLE_AGEING_VALUES_ALL

Loan_No text primary key,
agreement_date date,
branch_name text,
loan_status text,
address1 text,
address2 text,
status_type integer,
user_id integer

и рассмотрим следующий запрос SQLite:

"SELECT COUNT(Loan_No) FROM " + TABLE_AGEING_VALUES_ALL + " WHERE user_id = \"" + user_id + "\" AND Loan_No = \"" + Loan_No + "\" AND status_type = " + status_type

Когда я хочу эту status_type переменную = НИЧЕГО, я могу просто позвонить:

"SELECT COUNT(Loan_No) FROM " + TABLE_AGEING_VALUES_ALL + " WHERE user_id = \"" + user_id + "\" AND Loan_No = \"" + Loan_No + "\""

но так как я передаю значения в переменную status_type из вызова функции Java, я просто не могу просто удалить этот столбец.

Итак, каков наиболее эффективный способ передачи значения в переменную status_type из вызова функции Java, когда я хочу, чтобы status_type variable = ANYTHING?

Например, что

"SELECT COUNT(Loan_No) FROM " + TABLE_AGEING_VALUES_ALL + " WHERE user_id = \"" + user_id + "\" AND Loan_No = \"" + Loan_No + "\" AND status_type = *"

не получается вообще.

Я уже искал в переполнении стека наиболее подходящее для него решение, наиболее подходящее уже:

Я получил что-то вроде, например, таких:

"SELECT COUNT(Loan_No) FROM " + TABLE_AGEING_VALUES_ALL + " WHERE user_id = \"" + user_id + "\" AND Loan_No = \"" + Loan_No + "\" AND status_type = status_type"

но есть ли какое-то конкретное решение этого вопроса, чтобы разобраться с ним?

Я согласен, что "status_type = status_type" всегда будет возвращать 1 уже всякий раз, когда это какая-либо заданная переменная, но что он также будет делать то же самое всякий раз, когда им уже заданы два достаточно разных значения одного и того же столбца?

Ответы [ 3 ]

0 голосов
/ 29 апреля 2018

Возможно, рассмотрите возможность использования чего-то вроде: -

public String buildGetLoadCountSQL(Integer userid, String loan_no, Integer status_type) {

    String whereclause = "";
    if(userid != null) {
        whereclause = whereclause + " user_id=" + String.valueOf(userid);
    }
    if (loan_no != null && loan_no.length() > 0) {
        if (whereclause.length() > 0) {
            whereclause = whereclause + " AND ";
        }
        whereclause = whereclause + " Loan_No=?'" + loan_no + "' ";
    }
    if (status_type != null) {
        if (whereclause.length() > 0) {
            whereclause = whereclause + " AND ";
        }
        whereclause = whereclause + " status_type=" + String.valueOf(status_type);
    }
    if (whereclause.length() > 1) {
        whereclause = " WHERE " + whereclause;
    }
    return "SELECT COUNT(Loan_No) FROM " + TABLE_AGEING_VALUES_ALL + whereclause;
}

При этом вы можете опустить любое из значений, указав в его месте значение null.

Например

    buildGetLoadCountSQL(null,null,null);

возвращает (все строки): -

    SELECT COUNT(Loan_No) FROM your_table

и

    buildGetLoadCountSQL(10,"0123456789",10);

возвращает (наиболее избирательно): -

    SELECT COUNT(Loan_No) FROM your_table WHERE userid=10 AND Loan_No= '0123456789' AND status_type=10

и

    buildGetLoadCountSQL(10,"0123456789",null);

возвращает (что вы хотите от вашего вопроса): -

    SELECT COUNT(Loan_No) FROM your_table WHERE userid=10 AND Loan_No= '0123456789'
  • Примечание Это принципиальный код, который не был проверен, поэтому может содержать незначительные ошибки.
0 голосов
/ 29 апреля 2018

Если вы ищете способ выполнить оба типа запросов с одинаковым текстом команды SQL, вы можете использовать запрос, подобный следующему:

String sql = 
          "SELECT COUNT(Loan_No) FROM TABLE_AGEING_VALUES_ALL "
        + "WHERE user_id = ? "
        + "    AND (1 = ? OR status_type = ?)";
PreparedStatement ps = conn.prepareStatement(sql);

Затем, чтобы соответствовать определенному типу status_, вы можете использовать

// query for user_id = 1 and a specific status_type
ps.setInt(1, 1);  // user_id = 1
ps.setInt(2, 0);  // 0 means "specific status_type"
ps.setInt(3, 2);  // status_type = 2
ResultSet rs = ps.executeQuery();

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

// query for user_id = 1 and any status_type
ps.setInt(1, 1);  // user_id = 1
ps.setInt(2, 1);  // 1 means "any status_type"
ps.setInt(3, 0);  // (this parameter is ignored)
ResultSet rs = ps.executeQuery();
0 голосов
/ 28 апреля 2018

Если вы хотите получить все status_type, нет необходимости указывать его в запросе.

Запрос будет

"ВЫБЕРИТЕ COUNT (Loan_No) ОТ" + TABLE_AGEING_VALUES_ALL + "WHERE user_id = \" "+ user_id +" \ "AND Loan_No = \" "+ Loan_No

...