You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 19:15:04