2015-02-18 4 views
0

Я хочу дать конечному пользователю возможность запрашивать базу данных MySQL динамически. Я предоставил им два текстовых поля для ввода их критериев поиска и после этого нажмите кнопку для запуска запроса. Первое текстовое поле позволяет им вводить целое число для поиска поля LoanID. Второй текстовый блок позволяет им вводить целое число для поиска в поле BookID. Запрос работает нормально, когда BOTH критерии были введены, однако, если конечный пользователь хочет только выполнить поиск, скажем, в BookID, я не получаю никаких результатов в запросе. Есть ли способ, с помощью которого я могу обрабатывать не-записи (null), чтобы запрос работал даже с одним введенным критерием?Как обрабатывать нулевые значения в простом динамическом SQL-запросе

Я использую ADOquery с MySQL DB, где типы данных для полей LoanID и BookID являются целыми. Таблица представляет собой типичную таблицу кредитов библиотеки, в которой показаны [LoanID], [LoanDate], [BorrowerID], [BookID]. Вот SQL до сих пор ... по рекомендации.

adoquery1.SQL.Clear; 
    adoquery1.SQL.Add('SELECT LoanID, LoanDate, BorrowerSurname,Loan.BookID, BookTitle FROM Loan,Book,Borrower'); 
    adoquery1.SQL.Add('WHERE Borrower.BorrowerID = Loan.BorrowerID AND'); 
    adoquery1.SQL.Add('Loan.BookID = Book.BookID AND'); 
    adoquery1.SQL.Add('LoanID = :LoanID OR :loanID IS NULL AND '); 
    adoquery1.SQL.Add('Loan.BookID = :BookID OR :BookID IS NULL'); 
    adoquery1.Parameters.ParamByName('LoanID').Value:= edit1.Text; 
    adoquery1.Parameters.ParamByName('BookID').Value:= edit2.Text; 
    adoquery1.open; 

ответ

0

1 = 1 Использование в качестве первого условия и построить запрос, добавив дополнительные условия, только если они заполнены.

Это стандартная практика, в псевдокоде (PHP на самом деле). :

$qry = 'SELECT * FROM table1'; 
$qry .= ' WHERE 1 = 1'; 
if ($loanID) { 
    $qry .= ' AND loanID = :loanID'; 
} 
if ($bookID) { 
    $qry .= ' AND bookID = :bookID'; 
} 
$sth = $dbh->prepare($qry); 
if ($loanID) { 
    $sth.bindParam(':loanID', $loanID); 
} 
if ($bookID) { 
    $sth.bindParam(':bookID', $bookID); 
} 
$sth->execute(); 

В качестве альтернативы вы можете сделать это в SQL, но это не так эффективно. Перейдите в NULL s в качестве параметров в этом случае:

$qry = 'SELECT * from table1'; 
$qry .= ' WHERE (loanID = :loanID OR :loanID IS NULL)'; 
$qry .= ' AND (bookID = :bookID OR :bookID IS NULL)'; 
+0

Я попытался изменить SQL, как вы рекомендовали - см. Оригинальное сообщение. Получение сообщения: «Объект параметров неверно определен. Предоставлена ​​несогласованная или неполная информация». – user3396486

+0

Вам нужны пробелы после AND и до ГДЕ? Я не знаю, как работает ваша функция SQL.Add(). В любом случае, вы должны иметь возможность выработать детали из моего образца. –

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

  • Нет связанных вопросов^_^