SQLite:如何根据其他条件执行语句?

llycmphe  于 2023-02-05  发布在  SQLite
关注(0)|答案(1)|浏览(226)

视频游戏存在2个阶段:设置和游戏性。玩家可以使用设置来改变数据库,这会影响游戏性。然而,设置的一些功能必须考虑设置的其他功能,当与数据库交互时,因此必须根据数据库中的其他因素来改变执行语句。
例如:
在设置中,玩家可以选择启用或禁用称为"复杂商务"的设置,其在表"建筑物"中创建ID为"BUILDING_WAYSTATION"和"BUILDING_MINT"的新行,以及数据库中的许多其它改变。玩家可以选择启用称为"更容易商务"的第二设置,其更新表"ModiferArguments",增加通过许多键约束与"BUILDING_MARKET"相关联的列ID的列"VALUE"中的值(这将永远存在,无论什么)在表"建筑物"。但是,如果"复杂的商业"被启用,那么我们将希望改变更新列"价值"不同的市场,以及由"复杂商业"设置插入物引入的其它建筑物。
是否可以在SQLite语句中执行这种逻辑交互?
代码尝试:

IF
(
    EXISTS
    (
        SELECT
            *
        FROM
            Buildings
        WHERE
            BuildingType = 'BUILDING_WAYSTATION'
        ;
    )
)
THEN
(
    Update
        ModifierArguments
    SET
        Value = Value+1
    WHERE
        ModifierID = 'MARKET_TRADE_ROUTE_CAPACITY'
    ;
    
    Update
        ModifierArguments
    SET
        Value = Value+2
    WHERE
        ModifierID = 'MINT_TRADE_ROUTE_CAPACITY'
    ;
    
    Update
        ModifierArguments
    SET
        Value = Value+3
    WHERE
        ModifierID = 'WAYSTATION_TRADE_ROUTE_CAPACITY'
    ;
)
ELSE
(
    Update
        ModifierArguments
    SET
        Value = Value+2
    WHERE
        ModifierID = 'MARKET_TRADE_ROUTE_CAPACITY'
)
;

我非常抱歉的眼睛疼痛的格式,但我想确保我正在尝试做的逻辑是尽可能清楚。
代码理论:
使用IF和EXISTS,我们可以简单地通过查看是否存在ID为"BUILDING_WAYSTATION"的"Building"表条目行来查看数据库中是否发生了数据库更新的"复杂商务"集合.这允许选择针对"更容易商务"的设置执行哪一组UPDATE.如果"复杂商务"尚未被启用,则我们只需要将单个值更新为"2"。然而,如果它已被启用,则该单个值必须改为更新为"1",并且我们必须更新否则将不存在的其它值。
或者:
我已经考虑过使用CASE,但我不确定它是否能够实现同样的目的,只是简单地用IF替换CASE WHEN。我也考虑过使用iif(),但也有同样的问题,因为除了在显示时替换SELECT语句的返回数据外,它似乎不适合其他目的。

tcbh2hod

tcbh2hod1#

可以使用CASE表达式来应用逻辑:

UPDATE ModifierArguments
SET Value = Value + 
  CASE 
    WHEN EXISTS (SELECT * FROM Buildings WHERE BuildingType = 'BUILDING_WAYSTATION')
      THEN CASE ModifierID
        WHEN 'MARKET_TRADE_ROUTE_CAPACITY' THEN 1
        WHEN 'MINT_TRADE_ROUTE_CAPACITY' THEN 2
        WHEN 'WAYSTATION_TRADE_ROUTE_CAPACITY' THEN 3
      END
    ELSE CASE WHEN ModifierID = 'MARKET_TRADE_ROUTE_CAPACITY' THEN 2 ELSE 0 END
  END
WHERE ModifierID IN ('MARKET_TRADE_ROUTE_CAPACITY', 'MINT_TRADE_ROUTE_CAPACITY', 'WAYSTATION_TRADE_ROUTE_CAPACITY');

相关问题