原问题是一个关于 SQLite
触发器的问题。用 C
系语言描述逻辑如下:
// 只更新了行政区划代码,则按这个代码进行后续逻辑
if (new_addr == old_addr && new_code != old_code)
return new_code;
// 只更新了地址,则解析出地址对应的行政区划代码,再后续逻辑
else if (new_addr != old_addr && new_code == old_code)
return parse(new_addr);
// 两者都没更新,则是来自 INSERT 触发器的(SQLite 不支持合并 INSERT UPDATE 触发器)
// 提供了行政区划代码,则优先使用,否则解析提供的地址
else if (new_code == NULL)
return parse(new_addr);
else
return new_code;
其中,parse(new_addr)
实际是 40 行左右的 SQL
代码。重复写两次太冗余了,需要化简成一个。
我目前看不出啥共性,只能老老实实列出所有情况后,改写成一个位运算:
return (1 << (((new_addr == old_addr) << 2) | ((new_code == old_code) << 1) | (new_code == NULL))) & 0x71 ? new_code : parse(new_addr);
但看起来,可读性太差,维护起来麻烦。
还能化简成啥更直观、易维护的逻辑呢?
@无名啊,因为每行代码都return,所以可以安全的删除所有else。
@旧人,@寻梦xunm,挺不错的。8 种情况里,有 7 种都对了。
只有
new_addr != old_addr && new_code != old_code && new_code != NULL
时答案不对。原逻辑结果应为
new_code
,ChatGPT
结果为parse(new_addr)
。@老虎会游泳,对的,可以这样。
可能我觉得,一条
if
语句,可能会比,四条if
语句,参与讨论的人多。。@hik,现在还有啥不用注册就能使用的渠道嘛