SQL NEWBIE寻求解决方案。 我们有一个客户数据库,其中一个字段叫做CLOSED。如果它包含一个已关闭的值,否则为空。除非我运行单独的查询来显示它们,否则在搜索过程中不会显示CLOSED个案。因此,当我运行搜索并且没有显示任何内容时,我会在DELPHI应用程序上选择另一个按钮来显示CLOSED个案。我想要一个按钮选项,以便能够搜索案例,如果没有找到任何自动继续或重复搜索以显示CLOSED案例。不确定SQL查询是做什么的。但我相信我在正确的地方得到答案......先谢谢人们......
答案 0 :(得分:1)
实现您想要的一种方法是在Delphi应用程序中创建一个SQL语句
将其发送到服务器。如果我正确理解您的要求,即使有两种情况需要考虑,也只需要一个SQL语句; a)所有客户都很亲密,b)有些客户不是。但是,当您在Delphi应用程序中构造SQL时,您需要
请注意Sql Injection
的风险 - 请参阅https://en.wikipedia.org/wiki/SQL_injection。
更好的方法是在服务器上定义Stored Procedure
以进行检索
你想要的数据行。例如,在MS Sql Server中,您可以创建一个
Stored Procedure
喜欢这个
create procedure GetClients as
if (select count(*) from Clients where Closed is Null) > 0
select * from Clients where Closed is Null
else
select * from Clients
基本上,if ...
条件要求是有任何行,其中Closed id为Null。如果有,则第一个select ...
语句返回它们;如果没有,则返回所有行。
您可以从像这样的Delphi应用程序执行它
type
TForm1 = class(TForm)
ADOStoredProc1: TADOStoredProc;
DataSource1: TDataSource;
DBGrid1: TDBGrid;
DBNavigator1: TDBNavigator;
procedure FormCreate(Sender: TObject);
public
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
begin
AdoStoredProc1.ProcedureName := 'GetClients;1';
AdoStoredProc1.Open;
end;
(顺便说一句,为此,您需要在Object Inspector中为AdoStoredProc1设置合适的ConnectionString。
请注意,此示例应用程序不会在Delphi应用程序中构建任何 SQL,因此不存在Sql Injection
的风险。
您没有说出您的关闭列的数据类型。为了测试,我已经假设了 它是一个整数列,但任何其他类型都应该有效。
上面的应用程序是故意极简主义的,基本上是为了说明你可以在服务器端代码中做这样的事情。实际上,您可以参数化Stored Proc
,以便根据其他列值限制结果。