SQLite技术问询:如何依据数据库其他条件执行SQL语句?
在SQLite中实现游戏贸易设置的条件更新逻辑
完全可以在SQLite里实现你描述的逻辑,下面给你几种实用的方案,同时解答你关于CASE、iif()和IF的疑问:
方案1:拆分两条UPDATE语句(直观易维护)
这种方式逻辑清晰,适合理解和后期调整:
-- 处理MARKET_TRADE_ROUTE_CAPACITY的增量,根据复杂贸易状态判断加1还是加2 UPDATE GlobalParameters SET Value = Value + CASE WHEN EXISTS(SELECT 1 FROM Buildings WHERE BuildingType = 'BUILDING_WAYSTATION') THEN 1 ELSE 2 END WHERE Name = 'MARKET_TRADE_ROUTE_CAPACITY'; -- 仅当复杂贸易启用时,更新另外两个参数的增量(这里假设增量为1,可根据需求修改) UPDATE GlobalParameters SET Value = Value + 1 WHERE Name IN ('MINT_TRADE_ROUTE_CAPACITY', 'WAYSTATION_TRADE_ROUTE_CAPACITY') AND EXISTS(SELECT 1 FROM Buildings WHERE BuildingType = 'BUILDING_WAYSTATION');
方案2:用WITH子句统一状态判断(单语句实现)
如果想把逻辑整合到一条SQL里,可以用CTE先获取复杂贸易的启用状态,再批量更新:
WITH HasComplexCommerce AS ( -- 先判断是否存在WAYSTATION,得到复杂贸易的启用状态 SELECT EXISTS(SELECT 1 FROM Buildings WHERE BuildingType = 'BUILDING_WAYSTATION') AS is_enabled ) UPDATE GlobalParameters SET Value = Value + CASE -- MARKET的增量根据状态调整 WHEN Name = 'MARKET_TRADE_ROUTE_CAPACITY' THEN (SELECT CASE WHEN is_enabled THEN 1 ELSE 2 END FROM HasComplexCommerce) -- 另外两个参数仅在复杂贸易启用时加1 WHEN Name IN ('MINT_TRADE_ROUTE_CAPACITY', 'WAYSTATION_TRADE_ROUTE_CAPACITY') THEN 1 ELSE 0 -- 其他行不做更新 END WHERE -- 只处理目标参数行 Name IN ('MARKET_TRADE_ROUTE_CAPACITY', 'MINT_TRADE_ROUTE_CAPACITY', 'WAYSTATION_TRADE_ROUTE_CAPACITY') -- 确保另外两个参数只有在复杂贸易启用时才被更新 AND (Name = 'MARKET_TRADE_ROUTE_CAPACITY' OR (SELECT is_enabled FROM HasComplexCommerce));
关于CASE、iif()和IF的疑问
IF:SQLite中的IF是控制流语句,只能在触发器、存储过程或者通过命令行.exec执行的脚本中使用,单独的SQL查询/更新语句里没法直接用IF...ELSE分支逻辑。CASE:完全满足你的需求,它是通用的条件表达式,支持多分支判断,适合在UPDATE的SET子句里做动态赋值,也是上面方案的核心。iif():这是CASE的简化版,仅适合二选一的简单场景,比如判断复杂贸易状态时,也可以写成iif(EXISTS(...), 1, 2),但灵活性不如CASE,如果以后逻辑扩展(比如再加第三种贸易模式),CASE更容易修改。
内容的提问来源于stack exchange,提问作者Denver Thomas
相关产品推荐
相关产品推荐

