sql - Firebird/Lazarus SQL 视图与选择 iif?
问题描述
我想从具有使用选择查询定义的计算字段的表中选择行。
例如,我的选择可能是:
Select FirstName,
LastName,
iif(Cast('Now' as date)-BirthDate<18, 'Minor', 'Major') as StatAge
from TableUsers;
使用 Lazarus,我想过滤 StatAge。
我使用工具直接在我的数据库上尝试了我的查询。
我可以像这样在查询中使用 Where 进行过滤:
Select *
from (
Select FirstName,
LastName,
iif(Cast('Now' as date)-BirthDate<18, 'Minor', 'Major') as StatAge
from TableUsers
)
Where StatAge = 'Minor';
但它不适用于拉撒路,TSQLQuery.Filter
我可以过滤其他字段,没问题。我的问题只在于这个计算字段。
所以也许我必须在我的数据库上创建一个视图?但是当我尝试使用查询添加视图时出现错误。
创建视图的我的 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";
解决方案
假设您的BirthDate
字段是 type Date
,如果您使用诸如 FlameRobin 之类的实用程序首先执行您在 q 中引用的 SQL,然后执行以下 SQL,您将看到您的 SQL 中有错误。错误是您iff
返回 a number of days,而不是years
,因此返回值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;
推荐阅读
- reactjs - 解决 react-hooks/exhaustive-deps 警告的最佳方法
- c++ - 如何在 C++ 11 的类中声明一个包含 n 个字符串的向量
- python - 将 Pandas 中的 VARIANT 类型插入 Snowflake
- javascript - 设置 sprite.visible = false 时,Sprite 拒绝变为不可见
- python - 查找列表中字符串的索引号
- python - Python:替代google无法识别为自动测试软件的selenium Webdriver
- html - 我无法设法覆盖 CSS 中的宽度样式
- postgresql - POSTGRES:无法连接到服务器:连接被拒绝(0x0000274D/10061)
- javascript - 如何设置“最大值”HTML中的标签?
- azure - Azure databricks - 无法使用来自 datalake 存储 gen2 服务的 spark 作业读取 .csv 文件