选择iif的Firebird / Lazarus SQL视图?

问题描述 投票:0回答:2

我想从表中选择具有使用select查询定义的计算字段的行。

例如,我的选择可能是:

Select FirstName, 
       LastName, 
       iif(Cast('Now' as date)-BirthDate<18, 'Minor', 'Major') as StatAge 
from TableUsers;

有了Lazarus,我想过滤StatAge。

我用工具在我的数据库上直接尝试了我的查询。

我可以使用像我那样的查询过滤:

Select * 
from (
  Select FirstName, 
         LastName, 
         iif(Cast('Now' as date)-BirthDate<18, 'Minor', 'Major') as StatAge 
  from TableUsers
) 
Where StatAge = 'Minor';

但它不适用于lazarus与TSQLQuery.Filter我可以过滤其他领域,没有问题。我的问题只有这个计算字段。

所以也许我必须在我的数据库上创建一个View?但是当我尝试使用查询添加视图时出现错误。

我的SQL代码创建视图如下,错误是

“无法成功的元数据更新无法格式化消息8:132 - 未找到消息文件C:\ WINDOWS \ SYSTEM32 \ firebird.msg。

我以前从未见过这个:

CREATE VIEW "TSTT_SELECT" ("ID_SENT", "Eng", "Char", "ID_STT", "Order", "Stat", "StartSAE", "RetSAE", "ArrSAE", "StartSHE", "RetSAE") 
AS 
Select "EMAIL_SENT"."ID", "EMAIL_SENT"."COMMANDE_TABLE", "EMAIL_SENT"."CHAR", "TSTT"."ID", "TSTT"."ORDER", iif("TSTT"."RETOUR_PREV" Is Not Null AND ("TSTT"."RETOUR_PREV">cast('Now' as date)), 'En retard', iif("TSTT"."Depart_SAE" Is Null, 'A expedier', iif("TSTT"."Depart_SAE" Is Not Null And "TSTT"."Arrivee_SHE" Is Not Null And "TSTT"."Depart_SHE" is null,'Chez le STT',iif("TSTT"."Depart_SHE" Is Not Null, 'Au depart STT', iif("TSTT"."Arrivee_SAE" Is Not Null, 'Récéptionné', ''))))) as "Statut", "TSTT"."Depart_SAE", "TSTT"."RETOUR_PREV", "TSTT"."Arrivee_SHE", "TSTT"."Depart_SHE", "TSTT"."Arrivee_SAE" 
from "EMAIL_SENT" 
   Left join "TSTT" on "EMAIL_SENT"."ID" = "TSTT"."ID_EMAIL";
sql view firebird lazarus iif
2个回答
1
投票

假设您的BirthDate字段是Date类型,如果您使用像FlameRobin这样的实用程序首先执行您在q中引用的SQL,然后执行以下SQL,您将看到SQL中存在错误。错误是你的iff返回了几天而不是几年,因此iff的返回值是错误的。我对Firebird SQL不是很熟悉所以在我的版本中通过乘以18乘以365来“修复”这当然忽略了闰年。

Select FirstName,
       LastName,
       Birthdate,
       iif(Cast('Now' as date)-BirthDate<18 * 365, 'Minor', 'Major') as StatAge ,
       Cast('Now' as date)-BirthDate
from TableUsers;

然后我设置了下面列出的最小Lazarus项目,它工作正常,包括正确过滤edFilter.Text表达式。

码:

  TForm1 = class(TForm)
    Button1: TButton;
    DataSource1: TDataSource;
    DBGrid1: TDBGrid;
    DBNavigator1: TDBNavigator;
    edFilter: TEdit;
    SQLConnector1: TSQLConnector;
    SQLQuery1: TSQLQuery;
    SQLTransaction1: TSQLTransaction;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  public
  end;

  [...]

  procedure TForm1.Button1Click(Sender: TObject);
  begin
    if not SQLQuery1.Filtered then
      SQLQuery1.Filter := edFilter.Text
    else
      SQLQuery1.Filter := '';
    SQLQuery1.Filtered := not SQLQuery1.Filtered;
  end;

  procedure TForm1.FormCreate(Sender: TObject);
  begin
    edFilter.Text := 'STATAGE = ''Minor''';
    SQLQuery1.Sql.Text :=
    'Select '#13#10
    + '  FirstName, '#13#10
    + '  LastName, '#13#10
    + '  Birthdate, '#13#10
    + '  iif(Cast(''Now'' as date)-BirthDate<18 * 365, ''Minor'', ''Major'') as StatAge , '#13#10
    + '  Cast(''Now'' as date)-BirthDate '#13#10
    + 'from TableUsers2;';

    SqlQuery1.Open;
  end;

0
投票

所以,我用IBX4Lazarus组件解决了我的问题。这是Interbase / firebird的特定组件。

我过去用它,因为火箭没有被拉撒路整合。现在,我们可以使用标准的lazarus组件连接到firebird DB,但是我们可以看到存在一些问题......所以我将只使用IBX组件进行更好的优化。

我的问题通过使用IBX4Lazarus解决:www.mwasoftware.co.uk

© www.soinside.com 2019 - 2024. All rights reserved.