1

私は次のUPDATE声明を持っています:

update MESSAGES set status=
    (select (CASE 
               WHEN from_id='111111111' 
               THEN (CASE 
                      WHEN status='A' 
                      THEN 'S' 
                  WHEN status='R' 
                      THEN 'D' 
                     END)
               WHEN to_id='111111111' 
               THEN (CASE 
                       WHEN status='A' 
                       THEN 'R' 
                   WHEN status='S' 
                       THEN 'D' 
                     END) 
             END)
    as status_value)
where primary_key='236499681204' 
and status_value not null ;

このクエリの問題は、最後の行でstatus_value認識されないことです。最後の比較を削除すると、and status_value not null動作します。上記のバージョンが機能するとは思いませんが、誰かが同じことを達成する代替案を教えてもらえますか?

ASクエリでキーワードを使用しUPDATEて変数を定義する方法はありますstatus_valueか?

編集

実際の要件は、 であるかどうかを確認するだけでなく、 である場合はstatus_value更新を実行しないことですnullnull

4

3 に答える 3

3

追加ELSE STATUSと削除を試みand status_value not nullます:

  update MESSAGES set status=
    (select (CASE 
               WHEN from_id='111111111' 
               THEN (CASE 
                      WHEN status='A' 
                      THEN 'S' 
                  WHEN status='R' 
                      THEN 'D' 
                     END)
               WHEN to_id='111111111' 
               THEN (CASE 
                       WHEN status='A' 
                       THEN 'R' 
                   WHEN status='S' 
                       THEN 'D' 
                     END) 
             ELSE STATUS 
             END)
    as status_value)
where primary_key='236499681204'; 

使ってみることもできますview

create view MyView as
select (CASE 
               WHEN from_id='111111111' 
               THEN (CASE 
                      WHEN status='A' 
                      THEN 'S' 
                  WHEN status='R' 
                      THEN 'D' 
                     END)
               WHEN to_id='111111111' 
               THEN (CASE 
                       WHEN status='A' 
                       THEN 'R' 
                   WHEN status='S' 
                       THEN 'D' 
                     END) 
             END)
    as status_value;

update MESSAGES set status= mv.status_value
from MyView mv
where primary_key='236499681204'
and mv.status_value is null

またはあなたが使用することができますcase in condition

 update MESSAGES set status=
    (select (CASE 
               WHEN from_id='111111111' 
               THEN (CASE 
                      WHEN status='A' 
                      THEN 'S' 
                  WHEN status='R' 
                      THEN 'D' 
                     END)
               WHEN to_id='111111111' 
               THEN (CASE 
                       WHEN status='A' 
                       THEN 'R' 
                   WHEN status='S' 
                       THEN 'D' 
                     END) 
             END)
    as status_value)
where primary_key='236499681204'
and CASE
     WHEN from_id='111111111' 
      THEN (CASE 
             WHEN status='A' 
             THEN 'S' 
             WHEN status='R' 
             THEN 'D' 
            END)
     WHEN to_id='111111111' 
      THEN (CASE 
             WHEN status='A' 
             THEN 'R' 
             WHEN status='S' 
             THEN 'D' 
            END) 
    END is not null; 
于 2012-10-03T21:03:24.080 に答える
1

あなたが望むのはヌルを取り除くことだけだと仮定すると、これを行うことができます:

update MESSAGES set status=
    IFNULL(
    (CASE WHEN from_id='111111111' THEN 
        (CASE WHEN status='A' THEN 'S' 
        WHEN status='R' THEN 'D' END)
    WHEN to_id='111111111' THEN 
        (CASE WHEN status='A' THEN 'R' 
        WHEN status='S' THEN 'D' END) END),
    status)
where primary_key='236499681204' ;
于 2012-10-03T21:09:10.390 に答える
1

update ステートメントのサブクエリを実行しようとしているように思えますが、実際にはそれほど必要ではないと思います。

次のように、クエリを少し単純化できます。

UPDATE MESSAGES
SET status = CASE
         WHEN 
            (from_id='111111111' AND status='A') THEN 'S'
         WHEN 
            (to_id  ='111111111' AND status='A') THEN 'R'
         WHEN 
            (from_id  ='111111111' AND status='R') OR
            (to_id  ='111111111' AND status='S') THEN 'D'

         ELSE status
         END
WHERE priamry_key = '236499681204'
于 2012-10-03T21:04:57.457 に答える