我在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”语句下 任何人都可以给出解释和/或解决方案吗? 任何帮助,将不胜感激。谢谢!
答案 0 :(得分:1)
问题不在于substr(resolved_name_full...
,而在于CASE。
CASE expression可以有两种不同的形式:
CASE x WHEN y THEN ...
:这会将x
的值与y
的值进行比较。CASE WHEN a THEN ...
:检查a
的值是真还是假。 UPDATE语句中的问题是CASE后面有一个值(resolved_name_full
),因此将resolved_name_full
的值与表达式resolved_name_full is not null and resolved_name_full != ''
的值进行比较,并且此比较始终失败,因为resolved_name_full
永远不会是0
或1
。
只需使用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;