根据程序中的某个变量,有一个参数可以为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。
答案 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