使用AND和OR进行SQL查询

时间:2013-09-11 10:16:06

标签: sql delphi

EDIT..sorry 列是字符串 db是我相信的mysql。

我正在尝试进行查询,但不确定如何编写,目前我有

   adoquery1.SQL.Add('SELECT * FROM workorder WHERE siteid=''p203'' AND worktype = ''CM'' AND reportdate > '''+edit1.text+'''') ;

使用日期分级器获取数据,然后使用edit1.text中的日期获取数据,我如何才能说出获取相同数据但是在两个日期之间使用reportdate?

示例

siteid = p203   AND
worktype = CM   AND
reportdate between edit1.text and edit2.text

2 个答案:

答案 0 :(得分:9)

许多数据库都有BETWEEN运算符,否则您始终可以使用(reportdate >= :date1 and reportdate <= :date2)

SELECT * FROM workorder 
WHERE siteid = :siteId AND worktype = :workType
AND reportdate between :date1 and :date2

或者,

SELECT * FROM workorder 
WHERE siteid = :siteId AND worktype = :workType
AND (reportdate >= :date1 and reportdate <= :date2)

第二种形式让您可以更好地控制是使用闭合开放(包括在开始时)还是封闭(包括在两端)边界。

理想情况下,您使用绑定参数 - 使用:name占位符表示语句中的每个参数,并为它们绑定值。 (我们使用其他语言?)。

以及防止SQL注入黑客和&amp;带引号的错误,对于DATETIMESTAMP数据类型,这也可能更可靠。日期应妥善解析&amp;字符串应该在应用层转换为,而不是在DB中存储为字符串。

答案 1 :(得分:7)

adoquery1.SQL.Add('SELECT * FROM workorder'); 
adoquery1.SQL.Add('WHERE siteid=:SiteId AND'); 
adoquery1.SQL.Add('worktype = :WorkType AND'); 
adoquery1.SQL.Add('reportdate between :StartDate and :EndDate ');

adoquery1.Parameters[0].Value := 'p203';
adoquery1.Parameters[1].Value := 'CN';
adoquery1.Parameters[2].Value := Edit1.Text;
adoquery1.Parameters[3].Value := Edit2.Text; 

这段代码片段的重点在于使用参数解决问题同样容易“内联”你的Sql。

主要的好处是你的数据会被自动消毒,有两种效果 - i)你可以防止Sql注入攻击; ii)你不必对数据进行预处理 - 例如,如果Surname是“O'Flannagan”通过那个因为内联值需要预处理功能,例如RemoveApostrophes()

Oracle等服务器还有一个额外的好处 - Oracle优化器将缓存查询计划。如果它遇到相同的Sql,它将使用缓存的计划,因此表现更好。它可以将参数标识为“相同”,但如果每次提供不同的Sql则不能。 (我不能特别评论其他RDBMS,但如果同样适用我也不会感到惊讶。)

在我看来,这种方法至少和另一种方法一样可读。