SQL表达式分析(100分)

  • 主题发起人 主题发起人 djh_djh
  • 开始时间 开始时间
D

djh_djh

Unregistered / Unconfirmed
GUEST, unregistred user!
//此段代码为由字段别名取其表达式但不稳定 有时经常取出一奇怪的字符
哪位高手有时间改写改写
function GetFieldExp(ASQL:string;AAliasName:string;out OExp:string):boolean;
type TIncStatus=(isUnknown,isInc,isDec);
var pSQL:PChar;
pExp:PChar;
ALIndex:integer;
J,Count:integer;
IncStatus:TIncStatus;
begin
Result:=False;
pSQL:=PChar(ASQL);
ALIndex:=Pos(AALiasName,ASQL);
if ALIndex=0 then exit;
inc(pSQL,ALIndex-2);
if pSQL^=',' then begin
OExp:=AAliasName;
result:=true;
exit;
end;
J:=0;
Count:=0;
IncStaTus:=isUnknown;
repeat begin
if PSQL^ in ['(',')'] then
if PSQL^='(' then Begin
Dec(J);
IncStaTus:=isDec;
end
else begin
IncStaTus:=isInc;
Inc(J);
end;
if (PSQL^ in LeadBytes) then begin
Dec(PSQL,2);
inc(count,2);
end
else begin
Dec(pSql);
inc(count);
end;
end;
until (J=0) and (IncStatus=isDec) and (PSQL^=',') or (PSQL^='') or (IncStatus=isUnknown) and (PSQL^=',');
try
pEXP:=AllocMem(count);
pEXP:=StrMove(pEXP,PSQL+1,count);//PChar(ASQL)+ALIndex-PSQL-1);
OEXP:=Trim(StrPas(pEXP));
if copy(OEXP,length(OEXP),1)=#39 then
Delete(OEXP,length(OEXP),1);
if LowCase(copy(OEXP,length(OEXP)-1,2)='as' then
Delete(OEXP,length(OEXP)-1,2);
if copy(OEXP,1,6)='select' then
Delete(OEXP,1,6);
if (OExp='') then
OExp:=AAliasName;
if (OExp[Length(OExp)]='.') then
OExp:=OExp+AAliasName;
result:=true;
finally
FreeMem(pEXP);
end;
end;
 
我讨厌看冗长的代码
 
很有意思的想法,先关注一下。
 
此函数如稳定 我可以动态构造出任意汇总过滤报表, 但有时用得好好的, 有时就不成,不得不采
采用Delphi提供的GetNextToken另写一个但功能不强大
 
我也是~~
 
to:djh_djh真是厉害
 
我仔细看了你的程序,但没看懂,不知道,这个函数的具体用法和用途。
你能不能再做一下详细的说明。
当我调用
GetFieldExp('select * from custom', 'custom', strOExp);时
返回strOExp=' * from';
你要干什么用呢?是我理解错了,还是执行错了。

你的程序很工整,风格很好,我感觉到这个函数有很大的用处,所以深究一下,请赐教。
 
如:strSQL:='select Table1.a as 字段1,(select table2.afda from table2 where table2.f1=table1.f1) as 字2 from Table1'
var Exp:string;
if GetFieldExp(strSQL,'字段1';Exp) then
showmessage(Exp);
if GetFieldExp(strSQL,'字2';Exp) then
showmessage(Exp);
 

Similar threads

后退
顶部