SQLite - update命令产生空值

时间:2014-04-16 07:33:57

标签: sqlite

我在SQLite数据库上执行某些更新时遇到问题。我正在使用SQLite 3 shell for Windows。 我正在运行以下命令:

update resovled_chrom_counts set genus =  
case resolved_name_full  
when resolved_name_full is not null and resolved_name_full != ''  
then substr(resolved_name_full,0,instr(resolved_name_full,' ')-1)  
else  
substr(original_name,0,instr(original_name,' ')-1)  
end;  

它似乎适用于大多数行,但有些只是在其genus字段中以null值结束。我尝试使用此表的“id”字段手动检查其中一些。例如,我发现id ='kew-1'的行在它的genus字段中为空,并运行以下查询:

select substr(resolved_name_full,0,instr(resolved_name_full,' ')-1)  
from resovled_chrom_counts  
where id='kew-1'; 

令我惊讶的是,我得到了一个结果(不是空的)! 看起来查询在“select”语句下工作,但不在“update”语句下 任何人都可以给出解释和/或解决方案吗? 任何帮助,将不胜感激。谢谢!

1 个答案:

答案 0 :(得分:1)

问题不在于substr(resolved_name_full...,而在于CASE。

CASE expression可以有两种不同的形式:

  1. CASE x WHEN y THEN ...:这会将x的值与y的值进行比较。
  2. CASE WHEN a THEN ...:检查a的值是真还是假。
  3. UPDATE语句中的问题是CASE后面有一个值(resolved_name_full),因此将resolved_name_full的值与表达式resolved_name_full is not null and resolved_name_full != ''的值进行比较,并且此比较始终失败,因为resolved_name_full永远不会是01

    只需使用CASE表达式的第二种形式:

    update resovled_chrom_counts set genus =
    case
    when resolved_name_full is not null and resolved_name_full != ''
    then substr(resolved_name_full,0,instr(resolved_name_full,' ')-1)
    else
    substr(original_name,0,instr(original_name,' ')-1)
    end;
    

    SQLFiddle