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

如何在C++ inja模板引擎中实现SQL插入时NULL与字符串的区分处理?

使用inja模板引擎处理SQL插入的NULL值与字符串值区分问题

在生成SQL插入语句时,VARCHAR类型列的字符串值需要用单引号包裹,而SQL NULL值则不需要。用inja模板引擎时,直接固定加单引号会把传入的"NULL"字符串渲染成'NULL',不符合需求;去掉单引号又无法处理正常字符串。

解决方案

可以通过inja的条件判断语法实现动态处理,核心注意两点:

  • 若要插入SQL NULL,优先使用nlohmann::json的null类型,而非字符串"NULL"
  • 在模板中用条件判断区分值类型,动态决定是否添加单引号

代码实现

  1. 定义正确的inja模板:
std::string insert_template = R"(
INSERT INTO [my_table] (col1) VALUES ( 
{% if my_value == null %}
{{my_value}}
{% else %}
'{{my_value}}'
{% endif %}
);
)";
  1. 处理普通字符串值:
nlohmann::json json_str;
json_str["my_value"] = "some_value";
std::string sql_str = inja::render(insert_template, json_str);
// 渲染结果:INSERT INTO [my_table] (col1) VALUES ( 'some_value' );
  1. 处理SQL NULL值:
nlohmann::json json_null;
json_null["my_value"] = nullptr; // 使用nlohmann::json原生null类型
std::string sql_null = inja::render(insert_template, json_null);
// 渲染结果:INSERT INTO [my_table] (col1) VALUES ( null );

特殊场景兼容

如果业务逻辑必须用字符串"NULL"标识SQL NULL,可修改模板的判断条件:

std::string insert_template = R"(
INSERT INTO [my_table] (col1) VALUES ( 
{% if my_value == "NULL" %}
NULL
{% else %}
'{{my_value}}'
{% endif %}
);
)";

此时传入json["my_value"] = "NULL";,渲染后会得到INSERT INTO [my_table] (col1) VALUES ( NULL );

内容的提问来源于stack exchange,提问作者Pedro Vicente

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 20:06:33