1

MySQL 使用“IS NULL”而不是“NULL”,那么我如何绑定变量来实现相同的效果?

现在我试着用这个

selectStmt.setNull( 2, java.sql.Types.VARCHAR );

当我打印“java.sql.Types.VARCHAR”时显示值 = 12?如果是这样,这如何在preparedstatment 中设置“IS NULL”?

更多细节:

即如果我在输入中有字符串=“”,我有兴趣查询(MySQL)是否为空。所以逻辑是这样的,

Connection c = SQLCon.connect();
PreparedStatement selectStmt = c.prepareStatement( "select * from "
                                    + TableName
                                    + " where P = ? AND M = ? AND PR = ? AND DR = ? " );


if ( P.trim().equals( "" ) ) 
{
   selectStmt.setNull( 1, java.sql.Types.VARCHAR );
} else 
{
   selectStmt.setString( 1, P );
}

if ( M.trim().equals( "" ) ) 
{
   selectStmt.setNull( 2, java.sql.Types.VARCHAR );
} else 
{
   selectStmt.setString( 2, M );
}

请指教

4

3 回答 3

6

如果您想将 where 子句中可能为 null 的列与可能为 null 的参数匹配,则实际上需要将其绑定两次,因为在 SQL 中,null 不等于其他任何内容,甚至是另一个 null。

PreparedStatement stmt = conn.prepareStatement("select * from foo where (? is null and bar is null) or (bar = ?)");
col = 1;
setVarchar(stmt, col++, var);
setVarchar(stmt, col++, var);

void setVarchar(PreparedStatement stmt, int col, String var)
{
  if (var == null)
    stmt.setNull(col, java.sql.Types.VARCHAR);
  else
    stmt.setString(col, var);
}
于 2012-08-14T22:22:59.387 回答
2

这看起来很奇怪,但你这样做:

if (variable == null) {
  selectStmt.setNull(2, java.sql.Types.VARCHAR);
} else {
  ...
}

这背后的原因是因为NULL是数据库中的值,而null在 Java 中没有值。有时,您需要区分从数据库中取回 aNULL与从数据库中取回任何内容。

于 2012-08-14T22:07:52.733 回答
0

这是一个 xml 输入,在 UI 用户上看到 NULL 为空白,因此发送空白作为输入

if ( P.trim().equals( "" ) )
  {
    sql += "P IS NULL";
  }
   else
  {
    sql += "P = ?";
  }

PreparedStatement selectStmt = c.prepareStatement( sql );

int i = 1;
// used to prevent index out of range issues

// Binding values for non-null strings ONLY
 if ( !(P.trim().equals( "" )) )
  {
    selectStmt.setString( i, P );
  i++;
  }
于 2012-08-15T21:42:01.347 回答