2016-09-30 4 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"; 

Заявление работает для этой цели, но я хочу упростить и объединить в выражении case. Любая помощь? Благодарю.Операция использования для обновления таблицы

+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, я всегда проверяю выражения и предикаты в инструкции 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 будет интерпретировать двойные кавычки, чтобы заключить * not * строковый литерал, но * идентификатор * (например, имя столбца). Одиночные кавычки являются стандартными и будут работать с любым параметром 'sql_mode'. Потенциальные ловушки использования двойных кавычек вокруг струнных литералов перевешивают любые потенциальные выгоды. – spencer7593

+0

вы правы ... у меня уже проблемы с двойными кавычками, но я всегда забываю, что ... – jmsf

0
CASE

Заявления в MYSQL

Есть два синтаксиса для случая отчетности

СИНТАКСИС 1:

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

СИНТАКСИС 2:

CASE 
    WHEN search_condition THEN statement_list 
    [WHEN search_condition THEN statement_list] ... 
    [ELSE statement_list] 
END CASE 

Объяснение на одном Синтаксис:

Для первого синтаксиса, case_value это выражение. Это значение сравнивается с выражением when_value в каждом предложении WHEN, пока один из них не будет равен. Когда будет найдено равное значение when_value, выполняется соответствующий оператор-оператор THEN statement_list. Если значение when_val равно, то выполняется оператор statement_list ELSE, если он есть.

Этот синтаксис не может использоваться для проверки равенства с NULL, поскольку NULL = NULL является ложным.

Объяснение на Синтаксис Two:

Для второго синтаксиса, каждый КОГДА Выражение предложения search_condition не вычисляется, пока одна правда, в этот момент его соответствующий пункт ТО statement_list выполняет. Если никакое условие search_condition не равно, выполняется оператор statement_list ELSE, если он есть.

Если нет, то когда значение__события или search_condition соответствует проверенному значению, а оператор CASE не содержит предложение ELSE, возникает случай, не найденный для ошибки оператора CASE.

Каждый statement_list состоит из одного или нескольких операторов SQL; пустой оператор_события не разрешен.

Для обработки ситуаций, когда никакое значение не соответствует какому-либо предложению WHEN, используйте ELSE, содержащий пустой блок BEGIN ... END, как показано в этом примере. (Отступ используется здесь в предложении 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

Привет, Нареш. Спасибо за ваш быстрый ответ и объяснение. – jmsf

+2

Не знаете, где вы получили эту информацию о предложении ELSE в синтаксисе два, но это неточно. Опускание предложения ELSE просто означает, что CASE «возвращает» null, если ни одно из условий не выполняется; и при использовании CASE в запросе я вполне уверен, что включение BEGIN и END (которое не завершает весь CASE) вызовет проблемы. Возможно, вы запутали условие «CASE WHEN», используемое для запросов, и тот, который использовался для процедурной логики? _ – Uueerdo

+0

@Uueerdo. У меня есть информация только от mysql.com, и я использовал эту часть для одного из моих проектов ... –