1

MySQL は「NULL」の代わりに「IS NULL」を使用するため、変数をバインドして同じことを達成するにはどうすればよいですか?

今、私はこれで試しました

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

「java.sql.Types.VARCHAR」を印刷すると、値= 12が表示されますか? もしそうなら、これはどのようにプリペアドステートメントで「IS NULL」を設定しますか?

詳細:

つまり、入力に string = " " がある場合、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

null の可能性がある where 句の列を null の可能性があるパラメーターと一致させたい場合は、実際には 2 回バインドする必要があります。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 に値がないためです。NULL場合によっては、データベースから何も返さない場合と、データベースからa を返す場合を区別する必要があります。

于 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 に答える