2

1 つのクエリで 2 つの mysql 行を更新するためのこの構文を見つけました。素晴らしいロジックのように見えますが、思い通りに動作させることができません。

この構文が間違っているかどうか誰かが教えてくれたら、とてもありがたいです。私はこれを正しく理解していますか?

$id_active = 1;
$id_swap = 2;

UPDATE article_test
// the column to update is 'sort_id' and since it is also the column I need to test,  then I use the same value for CASE right?
SET sort_id = CASE sort_id
WHEN $id_active THEN $id_swap  // sort_id 1 to become sort_id 2
WHEN $id_swap THEN $id_active // sort_id 2 to become sort_id 1
WHERE sort_id IN ($id_swap,$id_active) // test only rows with sort_id 1 & sort_id 2
4

2 に答える 2

2

代わりにこれを試してください:

UPDATE article_test
SET sort_id =
  CASE 
    WHEN sort_id = $id_active THEN $id_swap  
    WHEN sort_id = $id_swap THEN $id_active 
    ELSE sort_id
  END
WHERE sort_id IN ($id_swap, $id_active)

ご了承ください:

  • END句を指定する必要があります。
  • ELSE句を指定しなかった場合、デフォルトはNULLです。

Update2:これを明確にするために、CASE2 つの構文があります。最初のものは次のように単純化されています。

CASE sort_id
  WHEN $id_active THEN $id_swap  
  WHEN $id_swap   THEN $id_active 
  ELSE sort_id
END  

ご覧のとおり、 はキーワードsort_idの後に​​ 1 回だけ指定されます。しかし、 orCASEのような条件を追加したい場合はどうでしょう。この簡略化された構文では、これらの条件を追加できません。次のように、キーワードの後に​​リストを付けずに、別の方法で記述する必要があります。sort_id IN (1, 2, 3)otherfield LIKE ''sort_idCASE

CASE 
  WHEN sort_id = $id_active THEN $id_swap  
  WHEN sort_id = $id_swap   THEN $id_active 
  WHEN sort_id LIKE '' THEN blah
  ELSE sort_id
END 

CASEこれら2つの構文のいずれかで式を使用する場合、ステートメントでは、式の末尾に句UPDATEを記述する必要があります。式の中に混在させることはできません。句の最後に記述してください。WHERECASECASEUPDATE

于 2012-10-02T11:44:43.940 に答える
1

ELSE...END次のように case ステートメントを終了する必要があります。

UPDATE article_test
SET sort_id = CASE sort_id
WHEN $id_active THEN $id_swap  
WHEN $id_swap THEN $id_active 
else sort_id end
....
于 2012-10-02T11:43:15.233 に答える