sqlite3 UPDATE生成空值

时间:2012-03-27 16:38:12

标签: sql sqlite

我正在尝试从MySQL过渡到SQLIte3并遇到更新问题。我在redhat上使用SQLite 3.6.20。

我的第一行代码正常运行

 update atv_covar set noncomp= 2;

noncomp的所有值(在最右边的列中)都适当地设置为2.

select * from atv_covar;
A5202|S182|2
A5202|S183|2
A5202|S184|2

第二行代码给我带来了问题:

 update atv_covar 
 set noncomp= (select 1 from f4003 where
               atv_covar.study = f4003.study and 
               atv_covar.rpid = f4003.rpid and 
               (rsoffrx="81" or rsoffrx="77"));

它运行时不会产生错误,并将atv_covar.noncomp适当地设置为1,它与SELECT语句匹配。问题是它将atv_covar.noncomp的非匹配行更改为null,我希望它将它们保持为2。

select * from atv_covar;
A5202|S182|
A5202|S183|1
A5202|S184|

欢迎任何帮助。

1 个答案:

答案 0 :(得分:0)

@Dan,您的查询问题并非特定于SQLite;您正在更新atv_covar的所有行,但并非所有行都在f4003中都有对应关系,因此这些行默认为NULL。您应该过滤更新或提供默认值。

以下语句仅将1设置为影响过滤条件的行:

 UPDATE atv_covar
 SET noncomp = 1
 WHERE EXISTS (
     SELECT 'x'
     FROM f4003
     WHERE atv_covar.study = f4003.study
       AND atv_covar.rpid = f4003.rpid
       AND (rsoffrx="81" or rsoffrx="77")
 );

以下语句为noncomp的所有行设置1或2,具体取决于过滤匹配(使用此而不是两次更新):

 UPDATE atv_covar
 SET noncomp = COALESCE((
     SELECT 1
     FROM f4003
     WHERE atv_covar.study = f4003.study
       AND atv_covar.rpid = f4003.rpid
       AND (rsoffrx="81" or rsoffrx="77")
 ), 2);