在MS Access中,单个查询中可以执行多个操作

4

我是否可以在一次查询中执行多个操作,还是必须为每个想要进行的更改制作一个查询?

我有一个名为“Type”的列,其中可以具有字符串值“BOOL”,“WORD”或“DINT”

在一次单独的查询中,我想要:

  • 将所有“BOOL”更改为“DIGITAL”
  • 将所有“WORD”更改为“UINT”
  • 将所有“DINT”更改为“LONG”

是否可以在1个查询中完成此操作(如果可以,该如何实现)

还是我必须像这样进行多个查询:

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

非常感谢!

2个回答

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部分写在一行上,但为了更易于阅读,我已经换行)

(注:IIF是VB.NET中的一个函数,用于实现条件判断)


哦,太棒了!在Naresh的回复之后,我几乎放弃了所有的希望:P - Gutanoth

2

考虑使用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表。然后您就不需要修改查询。


1
啊,是的!如果需要更改,那个替换语句会使代码变得更易于修改,谢谢! - Gutanoth

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接