2013-02-14 44 views
4

我可能在单个查询中执行多个操作还是必须针对我希望进行的每个更改进行查询?MS_Access中的单个查询中的多个操作

我有一列“类型”至极可以有字符串值“BOOL”,“WORD”或“DINT”

在一个单一的查询,我想:

  • 改变一切在 “BOOL” 到 “数字化”
  • 改变一切 “WORD” 到 “UINT”
  • 改变一切 “DINT” 为 “LONG”

是我牛逼可能做到这一点在1个单查询(如果是的话,怎么样?)

还是我必须做出几个疑问是这样的:

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

提前感谢!

回答

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_TotalSwitch()版本。

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 2013-02-15 06:27:34

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部分都在同一行,但我所做的只是线断,因此更容易阅读)

+0

哦太棒了!在Naresh的回应后,我几乎放弃了所有希望:P – Gutanoth 2013-02-14 13:05:56