如何在不使用不同的预处理语句的情况下处理NULL和常规值?

Dur*_*dal 6 java jdbc prepared-statement

考虑这个简单的方法:

public ResultSet getByOwnerId(final Connection connection, final Integer id) throws SQLException {
    PreparedStatement statement = connection.prepareStatement("SELECT * FROM MyTable WHERE MyColumn = ?");
    statement.setObject(1, id);
    return statement.executeQuery();
}
Run Code Online (Sandbox Code Playgroud)

示例方法应该从列的值匹配的某个表中选择所有内容,这应该是简单的.丑陋的细节是,为id传递NULL将导致一个空的ResultSet,无论数据库中有多少行,因为SQL定义NULL而不是euqaling anying,甚至不是NULL.选择我知道的那些行的唯一方法是使用不同的where子句:

SELECT * FROM MyTable WHERE MyColumn IS NULL
Run Code Online (Sandbox Code Playgroud)

不幸的是,在所有情况下使方法正常工作的唯一方法似乎是有两个完全不同的执行路径,一个用于id参数为null而另一个用于常规值的情况.

这非常难看,当你有多个可以被删除的列时,很快就会变得非常混乱.如何使用相同的代码路径/语句处理NULL和普通值?

Jor*_*dão 0

您可以使用如下查询:

select * from MyTable where 
  case when ?1 is null then MyColumn is null else MyColumn = ?1
Run Code Online (Sandbox Code Playgroud)

但它重用了相同的参数,所以我不知道我提出的语法(?1)是否有效。