如何使用FireDAC查询选取名称带相同前缀的字段
问题:FireDAC如何按字段名前缀批量选取字段?
使用FireDAC时,有没有办法选取名称带有相同前缀的一组字段?
假设存在字段:PREFIX_col1、PREFIX_col2……
是否可以执行类似如下的查询请求:
SELECT 'PREFIX_*' FROM mytable;
现有表USERS包含7个字段:
- ID (PRIMARY KEY)
- USER_NickName
- USER_Password
- EMAIL_Recovery
- REG_Insert_DateTime
- REG_Edit_DateTime
- PICTURE
我希望通过类似如下的查询仅选取2个字段:
SELECT USER.* FROM USERS
上述写法的意图是仅查询以下两个字段:
- USER_NickName
- USER_Password
二者的字段名称带有相同前缀!我知道上述SELECT语句写法有误,请问是否可以不编写完整字段名,仅通过字段共同前缀来选取目标字段?
重要说明:我的问题是关于
FIREDAC的实现方案,而非原生SQL语句的写法!
解决方案
FireDAC本身完全支持这个需求,不需要依赖数据库的特殊SQL语法,两种常用实现方式如下:
方案1:全量查询后客户端隐藏非目标字段
如果数据量不大,直接查全表字段后在客户端过滤隐藏不需要的字段即可,代码最简单:
FDQuery1.SQL.Text := 'SELECT * FROM USERS'; FDQuery1.Open; // 遍历字段,仅保留USER_前缀的字段可见 for var i := 0 to FDQuery1.FieldCount - 1 do begin FDQuery1.Fields[i].Visible := Pos('USER_', FDQuery1.Fields[i].FieldName) = 1; end;
后续绑定控件、遍历取值的时候只会处理可见字段,完全符合使用要求。
方案2:预取元数据动态拼接SQL,服务端仅返回目标字段
如果要减少不必要的带宽占用,不想下载冗余字段,可以先通过FireDAC取表的元数据,筛选出符合前缀的字段后再生成查询语句:
var FieldList: TStringList := TStringList.Create; try // 读取USERS表的所有字段名 FDConnection1.GetFieldNames('', '', 'USERS', '', FieldList); // 筛选USER_前缀的字段 var TargetFields: TStringList := TStringList.Create; try for var i := 0 to FieldList.Count - 1 do begin if Pos('USER_', FieldList[i]) = 1 then TargetFields.Add(FieldList[i]); end; // 拼接最终查询语句 FDQuery1.SQL.Text := 'SELECT ' + TargetFields.CommaText + ' FROM USERS'; FDQuery1.Open; finally TargetFields.Free; end; finally FieldList.Free; end;
两种方案都是纯FireDAC层面的实现,不需要修改数据库侧逻辑,也不依赖特定数据库的SQL语法,通用性更强。
内容的提问来源于stack exchange,提问作者Roberto
相关产品推荐
相关产品推荐

