2016-09-30 2 views
3
UPDATE crm_accounts 
SET 
    reg = "Sim" 
WHERE age >= 17 
AND age <= 35 
AND balance > 0.00 
AND type = "Júnior"; 


UPDATE crm_accounts 
SET 
    reg = "Não" 
WHERE age >= 17 
AND age <= 35 
AND balance = 0.00 
AND type = "Júnior"; 


UPDATE crm_accounts 
SET 
    type = "Efetivo" 
WHERE age >= 17 
AND age <= 35 
AND type = "Júnior"; 

진술 문은 목적을 위해 작동하지만 단순화하고 사례 문을 결합하고 싶습니다. 어떤 도움이 필요합니까? 감사. MYSQL에서사례 테이블을 사용하여 테이블을 업데이트하십시오.

+1

당신은 무엇을 시도 했습니까? 약간 독서 : http://stackoverflow.com/a/15745186/180100 –

답변

2

UPDATE crm_accounts a 
    SET a.reg 
     = CASE 
      WHEN a.balance > 0.00 THEN 'Sim' 
      WHEN a.balance = 0.00 THEN 'Não' 
      ELSE a.reg 
     END 
     , a.type = 'Efetivo' 
    WHERE a.age >= 17 
    AND a.age <= 35 
    AND a.type = 'Júnior' 

때마다 내가 쓰고 있어요 업데이트 문 사장님 : 당신이 뭔가를 원하는 것처럼

같습니다 e this, 나는 항상 SELECT 문에서 표현식과 술어를 테스트하고 결과를 확인합니다. 모든 것을 UPDATE 문으로 변환하기 전에 필요한 방식으로 작동하는지 확인합니다.

SELECT a.age >= 17 
     , a.type 
     , a.reg AS old_reg 
     , CASE 
      WHEN a.balance > 0.00 THEN 'Sim' 
      WHEN a.balance = 0.00 THEN 'Não' 
      ELSE a.reg 
     END AS new_reg 
    FROM crm_accounts a 
    WHERE a.age >= 17 
    AND a.age <= 35 
    AND a.type = 'Júnior' 
+0

매력처럼 작동합니다. @ spencer7593에 감사드립니다. – jmsf

+1

참고 : 문자열 상수를 묶으려면 * 큰 따옴표 * 대신 작은 따옴표 *를 사용하는 것이 좋습니다. 예, MySQL에서는 문자열 리터럴을 큰 따옴표로 묶을 수 있습니다. 그러나 다른 데이터베이스는 그렇지 않습니다. 그리고 MySQL에서'sql_mode'가 ANSI_QUOTES를 포함하도록 변경되면, MySQL은 큰 따옴표를 해석하여 문자열 리터럴이 아닌 * 식별자 * (예 : 열 이름)를 둘러 쌉니다. 작은 따옴표는 표준이며'sql_mode' 설정과 함께 작동합니다. 문자열 리터럴 주위에 큰 따옴표를 사용하면 잠재적 인 이점보다 중요 할 수 있습니다. – spencer7593

+0

당신 말이 맞아요 ... 저는 이미 큰 따옴표에 문제가 있습니다. 그러나 나는 항상 그것을 잊어 버렸습니다 ... – jmsf

0

CASE 제표

는 CASE 문에 대한 두 개의 구문있다

SYNTAX 1

CASE case_value 
    WHEN when_value THEN statement_list 
    [WHEN when_value THEN statement_list] ... 
    [ELSE statement_list] 
END CASE 

SYNTAX 2

CASE 
    WHEN search_condition THEN statement_list 
    [WHEN search_condition THEN statement_list] ... 
    [ELSE statement_list] 
END CASE 
구문 하나에

설명 : 첫 번째 구문을 보려면

는 case_value는 표현이다. 이 값은 둘 중 하나가 같아지기 전까지 각 WHEN 절의 when_value 표현식과 비교됩니다. 동일한 when_value가 발견되면 해당하는 THEN 절인 statement_list가 실행됩니다. when_value가 같지 않으면 ELSE 절인 statement_list가 실행됩니다 (있는 경우).

이 구문은 NULL = NULL이 false이므로 NULL과 동일한지 테스트하는 데 사용할 수 없습니다. 구문 두번째

설명 : 제 구문 용

각 절 search_condition과 표현은 하나까지 평가 가리 그 THEN 대응 절 statement_list 실행되는 사실이다. search_condition이 같지 않으면 ELSE 절인 statement_list가 실행됩니다 (있는 경우).

when_value 또는 search_condition이 테스트 된 값과 일치하지 않고 CASE 문에 ELSE 절이 없으면 CASE 문에 대해 Case를 찾을 수 없습니다.

각 statement_list는 하나 이상의 SQL 문으로 구성됩니다. 빈 statement_list는 허용되지 않습니다.

WHEN 절에 의해 값이 일치하지 않는 상황을 처리하려면이 예제와 같이 빈 BEGIN ... END 블록을 포함하는 ELSE를 사용하십시오. 합니다 (ELSE 절 여기에 사용 된 들여 쓰기는 단지 명확성의 목적이고, 그렇지 않으면 중요하지 않습니다.)

DELIMITER | 

CREATE PROCEDURE p() 
    BEGIN 
    DECLARE v INT DEFAULT 1; 

    CASE v 
     WHEN 2 THEN SELECT v; 
     WHEN 3 THEN SELECT 0; 
     ELSE    
     END; 
    END CASE; 
    END; 
    | 

그리고 당신의 코드는이 같은 CASE 문을 사용하여 업데이트 할 수 있습니다 ..

UPDATE `crm_accounts` SET `reg` = CASE 

WHEN age >= 17 
AND age <= 35 
AND balance > 0.00 
AND type = "Júnior" THEN "Sim" 

WHEN age >= 17 
AND age <= 35 
AND balance = 0.00 
AND type = "Júnior" THEN "Não" 

WHEN age >= 17 
AND age <= 35 
AND type = "Júnior" THEN "Efetivo" 

ELSE `reg` 

END 
+0

안녕 Naresh. 빠른 응답과 설명에 감사드립니다. – jmsf

+2

구문 2에서 ELSE 절에 대한 정보를 얻은 위치가 확실하지 않지만 정확하지 않습니다. ELSE 절을 생략하면 단순히 when 조건이 충족되지 않으면 CASE는 "returns"를 의미합니다. 쿼리에서 CASE를 사용하면 BEGIN 및 END (전체 CASE를 종료하지는 않음)를 포함하면 문제가 발생할 것이라는 점만은 확실합니다. _ 쿼리에 사용 된'CASE WHEN 조건 '과 절차 적 논리에 사용 된 조건을 혼동했을 수도 있습니까? _ – Uueerdo

+0

@Uueerdo. 혼자 mysql.com에서 정보를 얻었고 내 프로젝트 중 하나를 위해이 다른 부분을 사용했습니다 ... –