SQL ve Çoklu Durumu Toplu Güncelle

4 Cevap php

Ben bir şartla bir sütun değer tabanı güncellemek istiyorsanız ben sadece bir basit +1 -1 durumda aşağıdaki sorguyu kullanabilirsiniz (tabii ki uygun PHP çağrısı veya ORM eşdeğer, çevirmek) yapabilirsiniz:

UPDATE articles SET STATUS = 0 WHERE STATUS  = 1;

Ama şimdi sorun orijinal dayanarak, ben istiyorum ki status, bir sözlükten status yeni bir değer anlaması. Sözlük böyle bir şey olduğunu varsayarsak:

dict['1']='3'
dict['12']='2'
dict['6']='2'

Anahtar-değer çifti arasında hiçbir ilişki yoktur. dict bir PHP sözlük nesne, yani ben "in memory dictionary" demek buydu.

Bu sorgu yazmak nasıl?

Edit: Question edit. I didn't frame the question properly... sorry!

4 Cevap

Eğer dönüşümlerin küçük bir sayı varsa, o zaman bir case deyimi kullanabilirsiniz.

BEGIN TRAN

UPDATE articles
SET status = 
       case 
          when status=1 then 3 
          when status=12 or status=6 then 2 
          else status --leave it unchanged if it doesn't match a case
       end

--COMMIT OR ROLLBACK

Rwmnau tarafından önerilen aksi eşleme tablosu yaklaşım

Sorgu kullanın:

UPDATE articles AR SET status = (SELECT value FROM dict WHERE key = AR.status)

Tabii ki, ben size veritabanında sözlük saklanan olduğunu varsayalım.

Nasıl böyle bir şey hakkında:

UPDATE articles
   SET status = n.new
  FROM articles a
  JOIN NewStatus n
    ON a.status = n.status

Mevcut durumu ile "durum" olarak adlandırılan bir, ve bunu güncellemek istedim statüsüne sahip "Yeni" olarak adlandırılan bir - Bu şekilde, iki sütun vardı "NewStatus" adında ikinci bir tablo olurdu. , Bu tabloya katılmak sizin güncelleme yapmak, ve o bunu çözmek gerekir. Eğer sadece NewStatus tabloda bunları içermez, güncelleştirmek istemediğiniz durumlar varsa da, - o zaman güncelleme açıklamada atlanır olacak.

Bu soru değiştirilmiş oldu gibi görünüyor, bu yüzden nokta eksik yaşıyorum, lütfen bana bildirin!

Soru belirsizdir ve siz kodu ve SQL karıştırma gibi görünen bu yana böyle bir şey (sözde Java) yapabilirdi:

StringBuilder sb = new StringBulder();

for (Map.Entry<Integer,Integer> entry : codes.entrySet) {

    sb.append(
      String.format("UPDATE articles SET Status=%s WHERE Status=%s\n", entry.getValue(), entry.getKey() 
       );

}

String sqlToExecute = sb.toString();
System.out.println(sqlToExecute);

Bu size değişiklikleri yapmak için çalıştırmak için SQL verecektir. Bu kod bir biri daha olacak eğer kapalı sonra Dize biçimlendirme kurtulmak ve yerine hazır deyimleri kullanın.