4

我的朋友,

我希望将 PostgreSQL libpqtypes 库与来自 C 应用程序的现有数据库一起使用。

我必须执行的一条 SQL 语句是插入到具有可为空的 int 列的表中。它有一个模式,我在这里简化为:

create table t (
    a int null
);

我一直在阅读 libpqtypes PQputf 和 PQexecf 函数的文档,但我没有看到如何将 SQL 空值传递给参数化 SQL 语句!

我不想传递 C NULL 值,因为这是一个 int 列,我希望存储在 DB 中的值是 SQL null,而不是 0。所以我不想这样做:

PQexecf(conn, "INSERT INTO t (a) VALUES (%int4)", NULL);

虽然我可以在生成传递给 PQexecf 的插入 SQL 语句格式字符串时直接包含 null,但我不希望这样做,因为有时我必须插入一个非 null 值。所以我不想这样做:

PQexecf(conn, "INSERT INTO t (a) VALUES (null)");

我的愿望和抱负是在调用 PQexecf 时使用一个通用格式的 SQL 插入语句字符串,并在我没有值时以某种方式传入一个空参数值。我想做这样的事情,其中​​ SQL_NULL 是告诉 libpqtypes 应该将 SQL null 插入数据库的某种方式:

void insert(int *a) {
    /* Other source codes. */

    PQexecf(conn, "INSERT INTO t (a) VALUES (%int4)", a ? *a : SQL_NULL);

    /* Other source codes. */
}

这可能吗?我该怎么做?

非常非常感谢您!

4

2 回答 2

0

使用"%null"内置类型。在文档中搜索此页面以查找“pqt 架构”。

// doesn't require a variable argument.
PQexecf(conn, "INSERT INTO t (a) VALUES (%null)");
于 2013-11-23T02:16:48.263 回答
0

据我所知,单独使用 libpqtypes 是不可能的(但我自己从未使用过 libpqtypes)。

不需要太多额外 C 代码的解决方法是选择一个值来代替“NULL”,并NULLIF在语句中使用将其转换为 SQL NULL:

// treat -1 as NULL
PQexecf(conn, "INSERT INTO t (a) VALUES (NULLLIF(%int4, -1))", a ? *a : -1);
于 2013-09-15T00:27:50.943 回答