【问题标题】:Multiple actions in a single Query in MS_AccessMS_Access 中单个查询中的多个操作
【发布时间】:2026-02-04 09:55:01
【问题描述】:

我是否可以在单个查询中执行多个操作,或者我是否必须针对我想要进行的每个更改进行查询?

我有一个“类型”列,其中可以包含字符串值“BOOL”、“WORD”或“DINT”

在一个查询中,我想:

  • 把所有的“BOOL”改成“DIGITAL”
  • 把所有的“WORD”改成“UINT”
  • 将所有“DINT”改为“LONG”

是否可以在 1 个单一查询中执行此操作(如果是,如何?)

或者我必须像这样进行几个查询:

UPDATE DB_Total SET Type = 'DIGITAL'
WHERE Type='BOOL';

提前致谢!

【问题讨论】:

    标签: sql ms-access ms-access-2007


    【解决方案1】:

    考虑将Switch() 作为嵌套IIf() 表达式的替代方案。

    有了这个数据在DB_Total...

    id Type
     1 BOOL
     2 abc
     3        <-- Type is Null
     4 WORD
     5 DINT
    

    ...此查询更新DB_Total,如下所示...

    UPDATE DB_Total
    SET [Type] = Switch(
        [Type]='BOOL','DIGITAL',
        [Type]='WORD','UINT',
        [Type]='DINT','LONG'
        )
    WHERE [Type] IN ('BOOL', 'WORD', 'DINT');
    

    DB_Total 之后:

    id Type
     1 DIGITAL
     2 abc
     3 
     4 UINT
     5 LONG
    

    不过,您可能会发现另一种方法更方便。创建replacements 表:

    id old_type new_type
     1 BOOL     DIGITAL
     2 WORD     UINT
     3 DINT     LONG
    

    那么UPDATE 语句将对DB_Total 产生与Switch() 版本相同的更改。

    UPDATE DB_Total AS d
    INNER JOIN replacements AS r
    ON d.Type = r.old_type
    SET d.Type = [r].[new_type];
    

    将来,如果您需要更改或添加/删除成对的单词替换,您只需编辑replacements 表。这样您就不需要修改查询了。

    【讨论】:

    • 啊,是的!如果需要,replace 语句可以更好地更改代码,谢谢!
    【解决方案2】:

    您可以使用嵌套的IIF 语句:

    UPDATE  DB_Total
    SET     Type = IIF(Type='BOOL','DIGITAL',
                        IIF(Type='WORD','UINT',
                            IIF(Type='DINT','LONG',Type)
                        )
                    )
    WHERE   Type IN ('BOOL', 'WORD', 'DINT');
    

    (我通常会将 IIF 部分全部写在一行上,但我已经做了换行符,这样更容易阅读)

    【讨论】:

    • 太棒了!在纳雷什的回应之后,我几乎放弃了所有希望:P