如何通过可以绑定参数的SQL语句在某些条件下更改某些列

时间:2015-11-05 04:39:27

标签: sql sqlite

CREATE TABLE "table" (
"id"  INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
"col1" BLOB,
"col2" BLOB,
"col3" BLOB,
"coln" BLOB
);

id|col1|col2|col3|coln
1 | 1-1| 1-2| 1-3| 1-n
2 | 2-1| 2-2| 2-3| 2-n

UPDATE table SET col1=?, col2=?, col3=?, coln=? WHERE id=?;

如何通过上述SQL语句在某些条件下不改变某些列。

源码。

例如,

public static class Bean{
    public long id;
    public byte[] col1;
    public byte[] col2;
    public byte[] col3;
    public byte[] coln;
}

PreparedStatement psUpdate = dsConn.prepareStatement("UPDATE table SET col1=?, col2=?, col3=?, coln=? WHERE id=?;");
Bean bean = new Bean();
if(null != bean.col1){
    psUpdate.setBytes(1, bean.col1);//col1
}else{
    psUpdate.omitColumn(1);//omit to update
}
if(null != bean.col2){
    psUpdate.setBytes(2, bean.col2);//col2
}else{
    psUpdate.omitColumn(2);//omit to update
}
if(null != bean.col3){
    psUpdate.setBytes(3, bean.col3);//col3
}else{
    psUpdate.omitColumn(3);//omit to update
}
if(null != bean.coln){
    psUpdate.setBytes(4, bean.coln);//coln
}else{
    psUpdate.omitColumn(4);//omit to update
}
psUpdate.setBytes(5, bean.id);//WHERE id=?
psUpdate.executeUpdate();

我已经阅读了有关sqlite或java的文档。不幸的是,这似乎是不可能的。

1 个答案:

答案 0 :(得分:0)

您应该只构造适当的UPDATE语句,只包含您实际想要更新的列。

但是如果你真的想要使用单个语句,那么如果参数为NULL,你可以使用CASE expressions用旧值更新列:

UPDATE MyTable
SET col1 = CASE WHEN ?1 IS NULL THEN col1 ELSE ?1 END,
    col2 = CASE WHEN ?2 IS NULL THEN col2 ELSE ?2 END,
    ...
WHERE id = ?5;