使用ogrinfo(SQLite方言)更新Shapefile行记录时的异常问题
问题原因及解决办法
错误根源
你的UPDATE语句里的CASE表达式没加ELSE分支,导致每次执行更新时,所有不匹配目标name的行,iacolor字段都会被默认设为NULL——这就是第一次设置的"amber"被第二条命令清掉的原因。
比如第一条命令:
ogrinfo tmp.shp -dialect sqlite -sql 'update tmp set iacolor=case when name="50mn_R9_10" then "amber" end'
这条命令其实已经把所有name不等于"50mn_R9_10"的行的iacolor改成了NULL(如果原来有值也会被清空)。第二条命令执行时,同样的逻辑,只有name匹配"50mn_R10_R11"的行被设为red,其他行(包括之前设amber的)全被改成NULL。
两种修正方案
方案1:给CASE表达式加ELSE分支保留原值
每次更新时,只修改目标行,其他行保留原有iacolor值:
第一条命令修正后:
ogrinfo tmp.shp -dialect sqlite -sql 'update tmp set iacolor=case when name="50mn_R9_10" then "amber" else iacolor end'
第二条命令修正后:
ogrinfo tmp.shp -dialect sqlite -sql 'update tmp set iacolor=case when name="50mn_R10_R11" then "red" else iacolor end'
方案2:用WHERE条件限定更新范围(推荐)
直接通过WHERE子句指定要更新的行,这样只会修改匹配的记录,完全不影响其他行,逻辑更清晰,效率也更高:
第一条命令:
ogrinfo tmp.shp -dialect sqlite -sql 'update tmp set iacolor="amber" where name="50mn_R9_10"'
第二条命令:
ogrinfo tmp.shp -dialect sqlite -sql 'update tmp set iacolor="red" where name="50mn_R10_R11"'
内容的提问来源于stack exchange,提问作者Gery
相关产品推荐
相关产品推荐

