2013-02-14 2 views
4

단일 쿼리에서 여러 동작을 수행 할 수 있습니까? 아니면 모든 변경 작업을 수행 할 때마다 쿼리를 만들어야합니까?MS_Access의 단일 쿼리에서 여러 동작

나는 열 "유형"느릅 나무는 문자열 값 "BOOL"을 가질 수있다 "WORD"또는 하나 개의 쿼리에서 "DINT"

을 가지고, 나는 싶습니다 :

  • 모두 변경 "LONG"로 "UINT"에 "디지털"
  • 변화 모든 "WORD"
  • 변화 모든 "DINT"에 "BOOL"는

내가인가 (?, 만약 그렇다면, 어떻게) (1 개) 단일 쿼리에서이 작업을 수행 할 수

을 수 T 또는 내가 같이 몇 가지 질의을해야 할 :

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

사전에 감사!

답변

2

중첩 된 IIf() 표현식 대신 Switch()을 고려하십시오. 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 문이 Switch() 버전으로 DB_Total에 동일한 변화를 생성합니다. 변경하거나 추가/단어 교체의 쌍을 제거해야하는 경우 향후

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

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

관련 문제