使用fmt或std::format动态构建SQL查询语句的问题
正确构建动态SQL WHERE子句(基于fmt库)
你之前的尝试错误在于未正确处理元素格式化与拼接逻辑:
- 第一种写法直接用
param=@p{} OR作为分隔符拼接ids元素,导致元素未被格式化,分隔符错误插入到元素前后 - 第二种写法仅将join后的整体字符串替换到单个
{}中,无法为每个id生成独立的param=@pN片段
正确实现方式
方法1:转换每个元素后拼接
#include <fmt/core.h> #include <fmt/ranges.h> #include <vector> #include <numeric> // 假设input是你的输入容器 std::vector<int> ids(input.size()); std::iota(ids.begin(), ids.end(), 0); // 先将每个id转为"param=@pN"格式,再用" OR "连接所有片段 std::string clause = fmt::format("{}", fmt::join( fmt::views::transform(ids, [](int id) { return fmt::format("param=@p{}", id); }), " OR " ));
方法2:利用fmt::join的格式化重载(更简洁)
fmt库支持直接为join的每个元素指定格式字符串,无需手动转换:
std::string clause = fmt::format("{}", fmt::join(ids, " OR ", "param=@p{}"));
两种方式最终都会生成形如param=@p0 OR param=@p1 OR ...的SQL子句,符合需求。
内容的提问来源于stack exchange,提问作者Sam
相关产品推荐
相关产品推荐

