本帖最后由 hzy694358 于 2014-09-16 18:20:39 编辑

解决方案 »

  1.   

    update t1 set name=(id/2)||substr(name,instr(name,'@'),length(name)-instr(name,'@'))  where id=4;

    sqlite> CREATE TABLE t1(id int, name varchar(60));
    sqlite> INSERT INTO "t1" VALUES(4,'[email protected]');
    sqlite> select * from t1;
    id          name      
    ----------  ----------
    4           [email protected] 
    sqlite> update t1 set name=(id/2)||substr(name,instr(name,'@'),length(name)-instr(name,'@'))  where id=4;
    sqlite> select * from t1;
    id          name      
    ----------  ----------
    4           [email protected]  
    sqlite> 
      

  2.   

    上面的截取截取多了一个字符串,修正如下:
    update t1 set name=(id/2)||substr(name,instr(name,'@'),length(name)-instr(name,'@')+1)  where id=4;
    sqlite> CREATE TABLE t1(id int, name varchar(60));
    sqlite> INSERT INTO "t1" VALUES(4,'[email protected]');
    sqlite> select * from t1;
    id          name      
    ----------  ----------
    4           [email protected] 
    sqlite> update t1 set name=(id/2)||substr(name,instr(name,'@'),length(name)-instr(name,'@')+1)  where id=4;
    sqlite> select * from t1;
    id          name      
    ----------  ----------
    4           [email protected] 
    sqlite> 
      

  3.   


    非常感谢你的回答,这样是没问题的,那如果我想用bind的方式来设置,下面的语句是否可行呢?因为那个域名是从外面传进来的:
    sprintf(buf, "update contact set name=(id/2)||'@'||? ;");
    ret= sqlite.ExecuteQuery(buf);
    if (ret == SQLITE_OK)
    {
    sqlite.BindText(1, domain.c_str(), domain.length(), SQLITE_TRANSIENT);
    sqlite.Next();
    sqlite.CloseResult();
    }
      

  4.   


    非常感谢你的回答,这样是没问题的,那如果我想用bind的方式来设置,下面的语句是否可行呢?因为那个域名是从外面传进来的:
    sprintf(buf, "update contact set name=(id/2)||'@'||? ;");
    ret= sqlite.ExecuteQuery(buf);
    if (ret == SQLITE_OK)
    {
    sqlite.BindText(1, domain.c_str(), domain.length(), SQLITE_TRANSIENT);
    sqlite.Next();
    sqlite.CloseResult();
    }
    么有用过bind,不过sql语句到哪里都是可以执行的,你试试看。