You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 05:35:40