sql select with argument,可以为NULL

时间:2011-05-12 18:38:15

标签: 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);
}

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);
}

只是一个简单的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

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

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

2 个答案:

答案 0 :(得分:5)

使用Postgresql(但我认为不是标准的)你可以使用

SELECT * from some_table where field IS NOT DISTINCT FROM ?;
与plain =不同,

IS NOT DISTINCT FROM在双方均为NULL时为真。

答案 1 :(得分:3)

正如您所指出的,主要问题是:

SELECT * FROM table WHERE field = ? OR (? IS NULL AND field IS NULL)

实际上它是两个需要绑定的参数。

你可以使用(应该是相当便携的)构造来解决这个问题:

SELECT *
FROM table
INNER JOIN (SELECT ? AS param1 /* FROM DUAL */) AS params
    ON 1 = 1
WHERE field = param1
    OR COALESCE(param1, field) IS NULL