在具有多个子选择的大型 UPDATE 语句中,我们使用了大量嵌套的 IF() 语句。我想将这些更复杂的 IF() 语句重构为 CASE 语句,主要是为了提高可读性并减少编码错误的变化。
所以像这样的声明部分:
SET cr.Price=IF(cmr.dirty AND rtg.connectRateToMasterRate=0, cr.Price,
(cmr.price + IF(rtg.RateDeviationType='FIXED_AMOUNT',
rtg.masterRateRateDeviation, cmr.Price *
rtg.masterRateRateDeviation / 100)
)) * IF(masterSettings.masterCurrencyConvertActive='TRUE',
cuMaster.AValue / cu.AValue, 1),
Run Code Online (Sandbox Code Playgroud)
会变成这样:
SET
cr.Price = CASE WHEN cmr.dirty AND rtg.connectRateToMasterRate
THEN
(cmr.Price +
IF(rtg.RateDeviationType='FIXED_AMOUNT',
rtg.masterRateRateDeviation,
cmr.Price * rtg.masterRateRateDeviation / 100
)
) * IF(masterSettings.masterCurrencyConvertActive='TRUE',
cuMaster.AValue / cu.AValue,
1
)
ELSE cr.Price
END
Run Code Online (Sandbox Code Playgroud)
我的问题是这样的重构是否会对查询的性能产生影响。请记住,此更新查询将更新数千条记录,因此即使很小的增加也可能会产生重大影响。
顺便说一下,我们使用的是 MySQL 5.6.19。
在我们的Delphi 2007应用程序中,我们使用了很多以下结构
FdmBasic:=TdmBasicData(FindOwnerClass(AOwner,TdmBasicData));
Run Code Online (Sandbox Code Playgroud)
FindOwnerClass向上移动当前组件的Owner层次结构以查找特定类(在示例中为TdmBasicData).生成的对象存储在Field变量FdmBasic中.我们主要使用它来传递数据模块.
示例:生成报告时,生成的数据将被压缩并存储在通过数据模块TdmReportBaseData访问的表的Blob字段中.在我们的应用程序的单独模块中,有一些功能可以使用ReportBuilder以分页形式显示报表中的数据.这个模块(TdmRBReport)的主代码,使用一个类TRBTempdatabase到压缩blob数据转换为当前正在使用的ReportBuilder运行时reportdesigner可用不同的表.TdmRBReport可以访问TdmReportBaseData以获取各种与报告相关的数据(报告类型,报告计算设置等).TRBTempDatabase在TdmRBReport中构建,但必须能够访问TdmReportBasedata.所以现在使用上面的结构完成:
constructor TRBTempDatabase.Create(aOwner: TComponent);
begin
inherited Create(aOwner);
FdmReportBaseData := TdmRBReport(FindOwnerClass(Owner, TdmRBReport)).dmReportBaseData;
end;{- .Create }
Run Code Online (Sandbox Code Playgroud)
我的感觉是,这意味着TRBTempDatabase知道很多它的所有者,我想知道这是某种代码气味还是反模式.
你对此有何看法?这是代码味吗?如果是这样,有什么更好的方法?
我有一个从TCollection派生的集合,实现了GetEnumerator,所以我可以在类似的结构中使用它
for lElem in lCollection do
Run Code Online (Sandbox Code Playgroud)
枚举器派生自TObject,与Delphi提供的标准枚举器完全相同,因此没有所有者.
Delphi帮助提到,如果枚举器支持IDisposable,它将被处理掉,但这只适用于.NET.
我想知道的是,枚举器实例如何以及何时以及由谁被释放?
在Delphi Seattle 10中,我试图使用implements关键字委托接口的实现,但是当从第一个接口派生的接口也包含在类声明中时,不接受委托.
以下代码的编译失败,并显示"缺少接口方法IInterface1.DoSomethingFor1的实现"消息.如果我从类声明中删除IInterface2,代码将编译.如果我从其他东西中导出IInterface2,那么它也会编译.
我究竟做错了什么?或者我怎样才能做到这一点?
type
IInterface1 = interface(IInterface)
['{03FB3E2E-C0DD-4E17-B6CD-D333E1E7255E}']
procedure DoSomethingFor1;
end;
Iinterface2 = interface(IInterface1)
['{89C266E2-2816-46AD-96AA-DD74E78A4D1E}']
end;
T1 = class(TInterfacedObject, IInterface1, IInterface2)
private
Fi1: IInterface1;
public
property I1_Delegate: IInterface1 read Fi1 implements IInterface1;
end;
Run Code Online (Sandbox Code Playgroud) 我有一张包含历史记录的表,在主表中通过几个触发器发布.我想在历史表上创建一个select语句,其中每条记录都按其先前记录JOINed(由相同的LineID和最高的ActionDate标识),因此我可以提取这两者之间的差异.
我试过这个,但是(我的)SQL不允许引用JOINED子选择中的第一个"FROM"表:where子句中的未知列h1.LineID
select
h1.*,
prev.*
from history h1
LEFT OUTER JOIN
(Select *
From history h2
where h1.LineID=h2.LineID and h2.ActionDate < h1.ActionDate
order by Actiondate desc limit 1
) prev on h1.LineID=prev.LineID
Run Code Online (Sandbox Code Playgroud)
我怎么能做到这一点?
我有一个模板类,我想为其专门化整数类型的方法之一。我看到很多使用enable_if特征对模板化函数执行此操作的示例,但我似乎无法获得在类方法上执行此操作的正确语法。
我究竟做错了什么?
\n#include <iostream>\n\nusing namespace std;\n\ntemplate<typename T>\nclass Base {\n public:\n virtual ~Base() {};\n \n void f() {\n cout << "base\\n";\n };\n};\n\ntemplate<typename Q>\nvoid Base<std::enable_if<std::is_integral<Q>::value>::type>::f() {\n cout << "integral\\n";\n}\n\ntemplate<typename Q>\nvoid Base<!std::enable_if<!std::is_integral<Q>::value>::type>::f() {\n cout << "non-integral\\n";\n}\n\n\nint main()\n{\n Base<int> i;\n i.f();\n \n Base<std::string> s;\n s.f();\n return 0;\n}\nRun Code Online (Sandbox Code Playgroud)\n上面的代码无法编译:
\nmain.cpp:16:60: error: type/value mismatch at argument 1 in template parameter list for \xe2\x80\x98template class Base\xe2\x80\x99\n 16 | void Base<std::enable_if<!std::is_integral<Q>::value>::type>::f() {\n | ^\nmain.cpp:16:60: note: expected a type, got \xe2\x80\x98std::enable_if<(! std::is_integral<_Tp>::value)>::type\xe2\x80\x99\nmain.cpp:21:61: error: …Run Code Online (Sandbox Code Playgroud) 编辑:
有没有更好的方法呢?
TPendingBets = class(TDataModule)
private
public
function GetBdy(out IdEvent : Integer ) : Boolean; overload;
function GetBdy(out IdEvent : Integer; out idBetType : TBetTypes) : Boolean; overload;
function GetBdy(out IdEvent : Integer; out idBetType : TBetTypes; Out TotalOrgStake,Price : Double; out PriceError :Boolean): Boolean; overload;
end;
implementation
Run Code Online (Sandbox Code Playgroud)
////////////////////
function TPendingBets.GetBdy(out IdEvent : Integer ): Boolean;
var idBetType : TBetTypes;
TotalOrgStake,Price : Double;
PriceError :Boolean;
begin
result := GetBdy(IdEvent,idBetType,TotalOrgStake,Price,PriceError);
end;
Run Code Online (Sandbox Code Playgroud)
////////////////////
function TPendingBets.GetBdy(out IdEvent : Integer; out idBetType : TBetTypes): …Run Code Online (Sandbox Code Playgroud)