2013-02-14 18 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