日期:2014-05-20  浏览次数:20841 次

请教高人写一条灵活的sql语句
请教高人写一条灵活的sql语句:要求:如数据库中字段NAME(Not   null),TYPE1(Not   null),TYPE2,TYPE3,TYPE4,TYPE5,TYPE6,TYPE7,TYPE8,TYPE9,TYPE10
,现在想通过JDBC向数据库Insert一条记录,但是,TYPE2~TYPE10的值要求在程序中进行判断,如果Type2为null,就在SQL语句中不对TYPE2处理,如果不为null,在SQL语句中就加入Type2字段和值。依此类推!!!这样的话SQL语句怎么写呢?

------解决方案--------------------
null是sql里面的关键字,直接写null(字符串)就行了。不用特殊处理
------解决方案--------------------
case when type2 is not null then type2 else null end,
------解决方案--------------------
string sql_ins = "insert into targetTable ( ";
string sql_val = "values ( ";
sql_ins += "name,type1 ";
sql_val += " ' " + o.getName() + " ', ";
sql_val += " ' " + o.getType1() + " ' ";
if (!(o.getType2() == null || " ".equals(o.getType2())))
{
sql_ins += ",type2 ";
sql_val += ", ' " + o.getType2() + " ' ";
}//TYPE3-Type10的处理与此相同
sql_val += ") ";
sql_ins + ") ";
string sql = sql_ins + " " + sql_val;

------解决方案--------------------
動態組字符SQL
------解决方案--------------------
nvl()函数
------解决方案--------------------
不知道下面的这些代码是否能满足你的要求,全是动态的

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.Map;
import java.util.TreeMap;

public class Insert {

  public static void main(String[] args) {
    try {
      Class.forName( "com.mysql.jdbc.Driver ");
    } catch (ClassNotFoundException e) {    
      e.printStackTrace();
    }
    Connection con = null;
    PreparedStatement ps = null;    
    try {
      String url = "jdbc:mysql://localhost:3306/bookstore ";
      String user = "root ";
      String password = "root ";
      con = DriverManager.getConnection(url, user, password);
      Tbl tbl = new Tbl();
      tbl.setName( "pengyiming ");
      tbl.setType1( "a ");      
      tbl.setType3( "c ");
      
      Map <String, String> map = tbl.getMap();
      
      // 通过 map 生成 SQL
      StringBuffer type = new StringBuffer( "INSERT INTO tbl ( ");
      StringBuffer value = new StringBuffer( " VALUES ( ");
      for(Map.Entry <String, String> entry : map.entrySet()) {
        type.append(entry.getKey()).append( ", ");
        value.append( "?, ");
      }
      String sql = type.append( ") ").append(value).append( ") ").toString();
      sql = sql.replace( ",) ", ") ");
      
      ps = con.prepareStatement(sql);
      
      // 通过 map 设置 PreparedStatement 的值
      int i = 1;
      for(Map.Entry <String, String> entry : map.entrySet()) {
        ps.setString(i, entry.getValue());
        i++;
      }      
      ps.executeUpdate();  
      
    }catch(SQLException e) {
      e.printStackTrace();
    }finally{
      try {
        ps.close();
        con.close();
      } catch (SQLException e) {
        e.printStackTrace();
      }      
    }        
  }
}