sql select with argument,可以为NULL

rve*_*rve 4 sql postgresql

根据程序中的某个变量,有一个参数可以为NULL的select查询的最佳方法是什么?

我可以想到两个解决方案(伪代码):

bool valueIsNull;
int value;

query = "SELECT * FROM table WHERE field ";

if (valueIsNull)
{
  query += "IS NULL";
}
else
{
  query += "= ?";
}
statement st = sql.prepare(query);

if (!valueIsNull)
{
  st.bind(0, value);
}
Run Code Online (Sandbox Code Playgroud)

要么

bool valueIsNull;
int value;

query = "SELECT * FROM table WHERE field = ? OR (? IS NULL AND field IS NULL)";
statement st = sql.prepare(query);
if (valueIsNull)
{
  st.bindNull(0);
  st.bindNull(1);
}
else
{
  st.bind(0, value);
  st.bind(1, value);
}
Run Code Online (Sandbox Code Playgroud)

只是一个简单的SELECT语句有很多代码,我发现它只是丑陋而且不清楚.

最干净的方式是:

bool valueIsNull;
int value;

query = "SELECT * FROM table WHERE field = ?";   // <-- this does not work
statement st = sql.prepare(query);
st.bind(0, value, valueIsNull);  // <-- this works
Run Code Online (Sandbox Code Playgroud)

显然这不起作用.但有没有一个干净的方法来处理这个?

我认为这不重要,但我使用的是C++,cppdb和postgresql.

And*_*rus 5

使用Postgresql(但我相信不是标准的)你可以使用

SELECT * from some_table where field IS NOT DISTINCT FROM ?;
Run Code Online (Sandbox Code Playgroud)

IS NOT DISTINCT FROM,与plain =不同,当双方都为NULL时为真.