Zastanawiam się, czy to w ogóle jest możliwe. Chcę zaktualizować kolumnę x, jeśli warunek jest prawdziwy, w przeciwnym razie kolumna y zostałaby zaktualizowana
UPDATE table SET
(CASE (CONDITION) WHEN TRUE THEN columnx
ELSE columny
END)
= 25
Wszędzie szukałem, wypróbowałem kilka rzeczy i nie mogę znaleźć rozwiązania. Myślę, że to niemożliwe, ale pomyślałem, że spytam tutaj i zobaczę, czy ktoś już to zrobił. Z góry dziękuję.
sql
sql-update
case
pqsk
źródło
źródło
Odpowiedzi:
Nie możesz użyć warunku, aby zmienić strukturę zapytania, tylko powiązane dane. Możesz to zrobić:
To jest semantycznie to samo, ale pamiętaj, że obie kolumny będą zawsze aktualizowane . To prawdopodobnie nie spowoduje żadnych problemów, ale jeśli masz dużą ilość transakcyjnej, to może to spowodować problemy współbieżności.
Jedyny sposób, aby to zrobić konkretnie to, o co prosisz, jest użycie dynamicznego SQL. Jest to jednak coś, od czego zachęcałbym cię do trzymania się z daleka. Powyższe rozwiązanie prawie na pewno będzie wystarczające do tego, czego szukasz.
źródło
źródło
23
kilka sekund przed tym, jak ją opublikował. Jestem szybkim copypasterem!* min ago
, pokaże ci dokładny czas publikacji .Chcę zmienić lub zaktualizować mój ContactNo do 8018070999, gdzie jest 8018070777 przy użyciu instrukcji Case
źródło
Wiem, że to bardzo stare pytanie, ale to zadziałało:
pozdrowienia
źródło
Wiem, że to bardzo stare pytanie i problem został oznaczony jako naprawiony. Jeśli jednak ktoś ma przypadek taki jak mój, w którym tabela ma wyzwalacz do logowania danych o zdarzeniach aktualizacji, spowoduje to problem. Obie kolumny otrzymają aktualizację, a dziennik będzie zawierał bezużyteczne wpisy. Tak jak ja
Teraz ma to kolejną zaletę, że nie ma niepotrzebnych zapisów na stole, jak powyższe rozwiązania.
źródło
Uważam, że możesz pominąć aktualizowanie kolumn „niepotrzebnych”, dostosowując inne odpowiedzi w następujący sposób:
update table set columnx = (case when condition1 then 25 end), columny = (case when condition2 then 25 end)
Jak rozumiem, zaktualizuje się tylko wtedy, gdy warunek zostanie spełniony.
Po przeczytaniu wszystkich komentarzy jest to najbardziej wydajne:
Update table set ColumnX = 25 where Condition1 Update table set ColumnY = 25 where Condition1
Przykładowa tabela:
CREATE TABLE [dbo].[tblTest]( [ColX] [int] NULL, [ColY] [int] NULL, [ColConditional] [bit] NULL, [id] [int] IDENTITY(1,1) NOT NULL ) ON [PRIMARY]
Przykładowe dane:
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)
Teraz zakładam, że możesz napisać warunek, który obsługuje wartości null. Na przykład zakładam, że napisałeś taki warunek, który ocenia jako True, False lub Null. Jeśli potrzebujesz pomocy, daj mi znać, a zrobię co w mojej mocy.
Teraz uruchomienie tych dwóch wierszy kodu powoduje zmianę X na 25 wtedy i tylko wtedy, gdy ColConditional ma wartość True (1) i Y na 25 wtedy i tylko wtedy, gdy ColConditional ma wartość False (0)
Update tblTest set ColX = 25 where ColConditional = 1 Update tblTest set ColY = 25 where ColConditional = 0
PS Przypadku zerowym nigdy nie wspomniano w pierwotnym pytaniu ani w jakichkolwiek aktualizacjach pytania, ale jak widać, ta bardzo prosta odpowiedź i tak je obsługuje.
źródło