T-SQL: Bir koşula bağlı olarak belirli sütunları güncellemek için UPDATE deyiminde bir CASE kullanma


109

Bunun mümkün olup olmadığını merak ediyorum. Bir koşul doğruysa x sütununu güncellemek istiyorum, aksi takdirde y sütunu güncellenir

UPDATE table SET
     (CASE (CONDITION) WHEN TRUE THEN columnx
                       ELSE columny
      END)
= 25

Her yeri araştırdım, bazı şeyleri denedim ve bir çözüm bulamadım. Sanırım bu mümkün değil, ama burada sorup daha önce kimse yapıp yapmadığına bakacağımı düşündüm. Şimdiden teşekkürler.


Hepsinin aynı masada olduğunu varsayarsak, evet. Kendiniz görmek için her zaman bir işlemde çalıştırabilir ve hata durumunda geri alabilirsiniz.
OMG Ponies

Ne anlatmak istediğinden emin değilim. Köşe için bir koşul koymayı denedim ama işe yaramıyor. Bir select ifadesi için çalışır, ancak bir güncelleme ifadesi için çalışmaz. (MyTable'dan (true olduğunda case (condition), ardından columnx else columny end) seçin .... güncelleme çalışmıyor ve nedenini görebiliyorum. Yok ' Bunu çalıştırmanın bir yolu gibi görünüyor.
pqsk

Yanıtlar:


189

Sorgunuzun yapısını değiştirmek için bir koşul kullanamazsınız, yalnızca ilgili verileri kullanabilirsiniz. Bunu yapabilirsin:

update table set
    columnx = (case when condition then 25 else columnx end),
    columny = (case when condition then columny else 25 end)

Bu anlamsal olarak aynıdır, ancak her iki sütunun da her zaman güncelleneceğini unutmayın . Bu muhtemelen size herhangi bir soruna neden olmaz, ancak yüksek bir işlem hacminiz varsa, bu eşzamanlılık sorunlarına neden olabilir.

Yapmanın tek yolu özellikle ne istediğini dinamik SQL kullanmaktır. Ancak bu, uzak durmanızı tavsiye edeceğim bir şey. Yukarıdaki çözüm, peşinde olduğunuz şey için neredeyse kesinlikle yeterli olacaktır.


Dinamik SQL konusunda hemfikirim. Peki verilerim etkilenecek mi? Demek istediğim, belirli koşullar için değiştirilmesini istemiyorum. Yani içeride olanı yeniden yerleştirecek mi? Db'ye yapılan isabet miktarı o kadar kötü olmayabilir.
pqsk

@pqsk: Bu sadece hangisi sütun için zaten olan takın gerektiğini verilerinizi etkilemez değil etkilendiği düşünülmektedir.
Adam Robinson

Teşekkürler. Ben bununla gideceğim. O kadar basit ki, bir mağara adamı bile yapabilir. haha.
pqsk

1
@AdamRobinson 1.5 yıl geçti, yalnızca bir sütunu güncellemenin daha verimli bir yolunu biliyor musunuz

@Somebodyisintrouble: Bir sütunu güncellemenin tek yolu farklı bir sorgu kullanmaktır.
Adam Robinson

23
UPDATE  table
SET     columnx = CASE WHEN condition THEN 25 ELSE columnx END,
        columny = CASE WHEN condition THEN columny ELSE 25 END

1
Adam'ın cevabını mı kopyaladınız yoksa bu başka bir yerden mi alındı? haha. Bunu fark ettim.
pqsk

1
@pqsk: Yanıtlarımız yaklaşık 1 dakika arayla verildi, bu yüzden biraz daha hızlı gönder'e tıkladığımı tahmin ediyorum;)
Adam Robinson

24
@pqsk: evet, Adam'ın yanıtını göndermeden 23birkaç saniye önce kopyaladım . Ben hızlı bir kopyalayıcıyım!
Quassnoi

2
@pqsk: İmleci öğesinin üzerine getirirseniz * min ago, size tam olarak gönderildiği zamanı gösterecektir.
Quassnoi

2
Adil olmak gerekirse, her ikisi de aynı olsa da: Adem'inki sizinkinden sonra çıksaydı, biraz daha detaylandırdı. Bu yüzden onunkini cevap olarak işaretledim. Yine de teşekkürler.
pqsk

4

görüntü açıklamasını buraya girin

Case deyimini kullanarak ContactNo'umu 8018070999 olan 8018070777'nin olduğu yerde değiştirmek veya güncellemek istiyorum

update [Contacts] set contactNo=(case 
when contactNo=8018070777 then 8018070999
else
contactNo
end)

görüntü açıklamasını buraya girin


1
bunun için neden bu sorguyu kullanmıyorsunuz GÜNCELLEME [Kişiler] SET contactNo = 8018070999 WHERE contactNo = 8018070777
NewGuy

4

Bunun çok eski bir soru olduğunu biliyorum ama bu benim için çalıştı:

UPDATE TABLE SET FIELD1 =
CASE 
WHEN FIELD1 = Condition1 THEN 'Result1'
WHEN FIELD1 = Condition2 THEN 'Result2'
WHEN FIELD1 = Condition3 THEN 'Result3'
END;

Saygılarımızla


1

Bunun çok eski bir soru olduğunu ve sorunun çözüldü olarak işaretlendiğini biliyorum. Ancak, tablonun güncelleme olaylarında veri kaydı için tetikleyici olduğu benimki gibi bir vakaya sahip biri, soruna neden olur. Her iki sütun da güncellemeyi alacak ve günlük gereksiz girişler yapacaktır. Yaptığım yol

IF (CONDITION) IS TRUE
BEGIN
    UPDATE table SET columnx = 25
END
ELSE
BEGIN
    UPDATE table SET columny = 25
END

Şimdi bunun başka bir yararı daha var, yukarıdaki çözümler gibi masaya gereksiz yazılar yazmaması.


bu iyi bir nokta ve iyi bir alternatif! Artık bu iş parçacığına yol açan orijinal kod üzerinde çalışmıyorum, ancak farklı çözümlere sahip olmak her zaman iyidir ve bunun iyi bir çözüm olduğunu düşünüyorum
pqsk

-1

Diğer yanıtları aşağıdaki gibi ayarlayarak "istenmeyen" sütunların güncellenmesini atlayabileceğinize inanıyorum:
update table set columnx = (case when condition1 then 25 end), columny = (case when condition2 then 25 end)

Anladığım kadarıyla, bu yalnızca koşul karşılandığında güncellenecek.

Tüm yorumları okuduktan sonra, bu en verimli olanıdır:
Update table set ColumnX = 25 where Condition1 Update table set ColumnY = 25 where Condition1

Örnek Tablo:
CREATE TABLE [dbo].[tblTest]( [ColX] [int] NULL, [ColY] [int] NULL, [ColConditional] [bit] NULL, [id] [int] IDENTITY(1,1) NOT NULL ) ON [PRIMARY]
Örnek Veriler:
Insert into tblTest (ColX, ColY, ColConditional) values (null, null, 0) Insert into tblTest (ColX, ColY, ColConditional) values (null, null, 0) Insert into tblTest (ColX, ColY, ColConditional) values (null, null, 1) Insert into tblTest (ColX, ColY, ColConditional) values (null, null, 1) Insert into tblTest (ColX, ColY, ColConditional) values (1, null, null) Insert into tblTest (ColX, ColY, ColConditional) values (2, null, null) Insert into tblTest (ColX, ColY, ColConditional) values (null, 1, null) Insert into tblTest (ColX, ColY, ColConditional) values (null, 2, null)

Şimdi, boş değerleri işleyen bir koşul yazabileceğinizi varsayıyorum. Örneğim için, True, False veya Null olarak değerlendirilen böyle bir koşul yazdığınızı varsayıyorum. Bu konuda yardıma ihtiyacın olursa bana haber ver, elimden geleni yapacağım.

Şimdi bu iki kod satırını çalıştırmak, yalnızca ve ancak ColConditional True (1) ise X'i 25'e ve ancak ve ancak ColConditional False (0) ise Y'yi 25'e değiştirir.

Update tblTest set ColX = 25 where ColConditional = 1 Update tblTest set ColY = 25 where ColConditional = 0

Not: Asıl soruda veya soruya yapılan herhangi bir güncellemede boş durumdan hiç bahsedilmemiştir, ancak görebileceğiniz gibi, bu çok basit cevap yine de onları ele alıyor.


1
Bu aslında işe yaramıyor. Birincisi, sütun boş değerlere izin veriyorsa, koşul karşılanmadığında boş bir değer atanır. Boş değerlere izin verilmediğinde, güncelleme başarısız olur. Son "verimli" sorgunuz, en azından TSQL'de geçersiz sql. Bunu belirli bir motorda test ettiniz ve işinize yaradı mı?
pqsk

Bunu SQL Server 2005'te test ettim ve gösterildiği gibi mükemmel çalışıyor. Neden reddedildiğini ve NULL değerinin güncellendiğini gösteren bir örnek bilmek istiyorum, çünkü yukarıdaki testimde boş değer güncellenmiyor. Her zaman en basit cevabın en iyisi olduğunu düşünmüşümdür ve milyonlarca kaydı olan bir veritabanıyla uğraşıyorsam, kesinlikle gereksiz satırları güncellemeye gitmek istemiyorum.
John Greiner
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.