Oracle中的NVL和Coalesce之间是否存在明显差异?
明显的区别在于coalesce将返回其参数列表中的第一个非null项,而nvl仅接受两个参数,如果不为null则返回第一个,否则返回第二个.
似乎NVL可能只是一个'基础案例'版本的合并.
我错过了什么吗?
我正在针对Oracle 11g数据库在JDBC上进行PreparedStatement查询,并发现传递null参数的结果与查询本身中定义"is null"不同.
例如,这个查询:
String sql = "SELECT col1 FROM tbl WHERE col2 = ?";
PreparedStatement ps = conn.prepareStatement(sql);
ps.setNull(1, java.sql.Types.INTEGER);
ps.execute();
Run Code Online (Sandbox Code Playgroud)
与此查询不同:
String sql = "SELECT col1 FROM tbl WHERE col2 is null";
PreparedStatement ps = conn.prepareStatement(sql);
ps.setNull(1, java.sql.Types.INTEGER);
ps.execute();
Run Code Online (Sandbox Code Playgroud)
我很好奇为什么会这样,我怎么能避免定义两个单独的SQL语句来涵盖"col2 = value"和"col2 is null"的情况.
我使用预准备语句来读取/写入我的数据库(SQLite)中的数据.在我的表中INVENTORY,有一些记录null在列中有值paleta(列VARCHAR在表中定义).我想选择这些记录,我试过:
sq = "SELECT * FROM INVENTORY WHERE paleta = ? AND product = ? AND lot = ?";
//...
stm = c.prepareStatement(sq);
stm.setNull(1, java.sql.Types.VARCHAR);
stm.setString(2, "theIdOftheProduct");
stm.setString(3, "theLotOftheProduct");
ResultSet rs = stm.executeQuery();
Run Code Online (Sandbox Code Playgroud)
上面的查询没有返回任何东西..我删除了paleta = ?,我得到了我想要的记录..如何SELECT * FROM INVENTORY WHERE paleta is null etc..使用查询参数定义查询?