9

このようにIFを使用できないのはなぜですか

UPDATE my_users
    IF(position2 = 18, "SET position = 17", ''),
    IF(position2 = 17, "SET position = 16", ''),
    IF(position2 = 16, "SET position = 15", ''),
        WHERE user_id => 170 AND user_id <= 1000

機能する唯一のものは

UPDATE my_users
    SET position2 = IF(position2 = 18, 17, 
                      IF(position2 = 17, 16, 
                        IF(position2 = 16, 15, ''
                      )
                        )
                          )
        WHERE user_id => 170 AND user_id <= 1000

そのフィールドposition2には40以上の条件があり、この方法で迷子になりやすいため、他の方法で同じことを行う方法はありますか?

編集:

私が走れば

UPDATE my_users
    SET position2 = CASE position2  WHEN 18 THEN 17
                    WHEN 17 THEN 16
                    WHEN 16 THEN 15
                    END
            WHERE user_id => 170 AND user_id <= 1000

CASEステートメントにないものがある場合position2、それを何も設定しません。CASEステートメントの内容以外の値を同じに保つにはどうすればよいですか

編集2: 解決策は次のとおりだと思います:

   UPDATE my_users
        SET position2 = CASE position2  WHEN 18 THEN 17
                        WHEN 17 THEN 16
                        WHEN 16 THEN 15
                            ELSE position2
                        END
                WHERE user_id => 170 AND user_id <= 1000

編集 3: 私のリクエストが 1 回限りのものではない場合、Vatev が示唆するように、リクエストがより高速になります。

   UPDATE my_users
        SET position2 = CASE position2  WHEN 18 THEN 17
                        WHEN 17 THEN 16
                        WHEN 16 THEN 15
                        END
                WHERE user_id => 170 AND user_id <= 1000
                AND position2 >= 16 and <= 18
4

2 に答える 2

4

次のようなこともできます。

                UPDATE my_users
                     SET position2 = CASE WHEN position2 =18 THEN 17
                        WHEN position2 =17 THEN 16
                        WHEN position2 =16 THEN 15 ELSE position2 
                        END
                WHERE user_id between 170 AND  1000
                AND position2 between 16 and  18
于 2014-02-03T17:59:21.650 に答える
2

これは私があなたのクエリを書き直す方法です:

UPDATE
  my_users
SET 
  position2 = position2 - 1
WHERE
  position2 >= 16
  AND position2 <= 18
  AND user_id >= 170 
  AND user_id <= 1000
于 2013-04-10T19:41:19.640 に答える