2010-03-28 5 views
1

테이블 posts의 열 published (게시되지 않음) 또는 1 (게시 됨) 인 열이 있습니다. 게시 된 모든 게시물을 게시되지 않은 게시물과 게시되지 않은 모든 게시물을 게시 된 게시물로 만들고 싶습니다. 내가mysql 명령 줄의 열 값 반전

UPDATE posts SET published = '1' WHERE published = '0'; 
UPDATE posts SET published = '0' WHERE published = '1'; 

를 실행하는 게시 된 게시물에 내 모든 게시물을 돌려 끝날 것이라는 점을 알고있다. mysql 커맨드 라인에서 어떻게 이러한 쿼리를 실행하여 위에 설명 된 실수와 반대되는 값을 실제로 "되돌릴"수 있습니까?

감사합니다.

EDIT : 데이터 유형이 문자열이라고 가정합니다. int/bool이이 작업을 수행하는 훨씬 더 좋은 방법이라는 것을 알고 있지만 문자열로 작업하고 있으며 스키마를 변경하는 것은 옵션이 아닙니다.

답변

2

사용 :

UPDATE posts 
    SET published = CASE 
        WHEN published IS NULL THEN NULL 
        WHEN published = '1' THEN '0' 
        ELSE '1' 
        END 
+0

사례가 좋은 일반적인 해결책입니다. 광산은 정수 0과 1에서만 작동했습니다. – MarkR

+0

이것은 정확히 내가 필요로했던 것입니다. 정말 고마워! – user94154

2

정말 어려운 것 같으면 충분히 생각하지 못했습니다.

UPDATE posts SET published = 1 - published; 

XOR 또는 CASE 사용과 같은 다른 해결책이 필요합니다.

+0

내가 문자열이 아닌 INTS 함께 일하고 있어요 경우/부울? 이것은 실제 스키마가 아니므로 무고한 사람을 보호하기 위해 변경했습니다. 내 질문에 문자열을 사용해야하지만 개념은 여전히 ​​동일합니다. 즉, 모든 열을 단일 열의 값으로 바꾸지 않고 열 A를 열 B의 값으로 변경하거나 그 반대로 변경합니다. – user94154

+0

사례가 가장 일반적인 해결책 일 것입니다. 저는 A에서 B와 B를 A로 바꾸는 것이 다른 문제라고 생각합니다. 나는 임시 변수를 지정하지 않고 즉시 답을 알지 못합니다. 나는 mysql UPDATE 문에서 평가 순서를 완전히 모르겠다. 그러나 열을 설정 한 후에 나중에 동일한 업데이트 문에서 식에서 사용하면 이전 값이 아닌 새 값이 사용된다는 느낌이 들었다. – MarkR

2

문자열의 경우 SET 절에있는 표현식을 사용할 수 있습니다.

UPDATE posts SET published = IF(published = "1", "0", "1"); 

CASE 버전, 감사 OMG 조랑말 : 두 버전의

UPDATE posts SET published = CASE published WHEN "1" THEN "0" ELSE "1" END; 

, 발표가 null의 경우는 NULL있는 모든 비교가 false로,이 "1"로 설정됩니다.

+0

+1 : 유효하지만 ANSI 표준이며 다른 대부분의 데이터베이스와 호환되므로 CASE를 사용하는 것이 좋습니다. –

+0

CASE가 가장 유용하다고 보입니다. IF() 함수에 대해 더 설명해 주시겠습니까? 논쟁의 순서는 아직 나에게 의미가 없습니다. – user94154

+0

@ user94154 : 첫 번째 인수는 평가할 문입니다. 두 번째 문은 문이 true이면 반환되는 값이고 세 번째 문은 문이 거짓 인 경우입니다. –

0

너희들이 어떻게 생각하십니까 :

UPDATE posts SET published = 'A1' WHERE published = 'A'; 
UPDATE posts SET published = 'B' WHERE published = 'A'; 
UPDATE posts SET published = 'A' WHERE published = 'A1'; 

편집 :이 원격으로 정확하지