如何在简单的动态SQL查询中处理Null值

时间:2015-02-18 18:39:56

标签: mysql ado delphi-2010

我想让我的最终用户动态查询MySQL数据库。我提供了两个文本框供他们输入搜索条件,然后单击按钮运行查询。第一个文本框允许他们输入一个整数来搜索LoanID字段。第二个文本框允许他们输入一个整数来搜索BookID字段。输入BOTH条件时查询工作正常,但是,如果最终用户只想使用BookID进行搜索,则查询中没有结果。有没有办法可以处理非条目(空值),这样即使输入一个条件,查询也能正常工作?

我正在使用带有MySQL DB的ADOquery,其中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;

1 个答案:

答案 0 :(得分: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)';