2011-01-28 13 views
74

Mi chiedo se ciò sia possibile. Voglio aggiornare colonna x se una condizione è vera, altrimenti colonna y sarebbe stato aggiornatoT-SQL: utilizzo di un CASE in un'istruzione UPDATE per aggiornare determinate colonne in base a una condizione

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

Ho cercato dappertutto, provato alcune cose e sono in grado di trovare una soluzione. Penso che non sia possibile, ma ho pensato di chiedere qui e vedere se qualcuno l'ha già fatto prima. Grazie in anticipo.

+0

Supponendo che tutto nella stessa tabella, sì.Puoi sempre eseguirlo in una transazione, e rollback su errore, per vedere di persona. –

+0

Non sono sicuro di cosa intendi. Ho provato a mettere un condizionale per la colonna, ma non funziona. Funziona per un'istruzione select, ma non per una dichiarazione di aggiornamento. (Selezionare (caso (condizione) quando true poi columnx else columny end) da myTable .... l'aggiornamento non funziona, e posso vedere perché. – pqsk

risposta

135

Non è possibile utilizzare una condizione per modificare la struttura della query, ma solo i dati coinvolti. Si potrebbe fare questo:

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

Questa è semanticamente lo stesso, ma solo tenere a mente che entrambe le colonne saranno sempre aggiornati. Questo probabilmente non causerà alcun problema, ma se si dispone di un volume transazionale elevato, ciò potrebbe causare problemi di concorrenza.

L'unico modo per fare in particolare quello che stai chiedendo è usare SQL dinamico. Questo è, comunque, qualcosa che ti incoraggerei a evitare. La soluzione sopra sarà quasi certamente sufficiente per quello che stai cercando.

+0

Accetto l'SQL dinamico. Quindi i miei dati saranno influenzati? Voglio dire che non lo voglio cambiato per certe condizioni. Quindi reinserirà solo ciò che è già lì dentro? La quantità di colpi al db potrebbe non essere così male. – pqsk

+0

@pqsk: questo non dovrebbe influenzare i dati, dovrebbe solo reinserire ciò che è già presente per qualsiasi colonna * non * dovrebbe essere interessata. –

+0

Grazie. Ho intenzione di andare con questo. Così semplice, anche un uomo delle caverne può farlo. haha. – pqsk

18
UPDATE table 
SET  columnx = CASE WHEN condition THEN 25 ELSE columnx END, 
     columny = CASE WHEN condition THEN columny ELSE 25 END 
+0

Hai appena copiato la risposta di Adam, o questa è stata presa da qualche altra parte? haha. Ho appena notato che ... – pqsk

+1

@pqsk: Le nostre risposte erano ~ 1 minuto di distanza, quindi immagino di aver solo cliccato invia un po 'più veloce;) –

+19

@pqsk: sì, ho appena copiato la risposta di Adam, '23 secondi prima che l'avesse postata. Sono un copypaster veloce! – Quassnoi

-1

credo che è possibile omettere l'aggiornamento delle colonne "non desiderati", regolando le altre risposte come segue:
update table set columnx = (case when condition1 then 25 end), columny = (case when condition2 then 25 end)

Da quanto ho capito, questo si aggiornerà solo quando la condizione è soddisfatta.

Dopo aver letto tutti i commenti, questo è il più efficiente:
Update table set ColumnX = 25 where Condition1 Update table set ColumnY = 25 where Condition1

tabella di esempio:
CREATE TABLE [dbo].[tblTest]( [ColX] [int] NULL, [ColY] [int] NULL, [ColConditional] [bit] NULL, [id] [int] IDENTITY(1,1) NOT NULL ) ON [PRIMARY]
dati di esempio:
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)

Ora presumo si può scrivere un condizionale che gestisce i null. Per il mio esempio, sto assumendo che tu abbia scritto un simile condizionale che valuti su True, False o Null. Se hai bisogno di aiuto con questo, fammi sapere e farò del mio meglio.

Ora l'esecuzione di questi due righe di codice fa infatti il ​​cambiamento X a 25 se e solo se ColConditional è vero (1) e Y a 25 se e solo se ColConditional è False (0)

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

P.S. Il caso nullo non è mai stato menzionato nella domanda originale o alcun aggiornamento alla domanda, ma come puoi vedere, questa risposta molto semplice li gestisce comunque.

+1

Questo in realtà non funziona. Per uno, se la colonna consente i valori nulli, quando la condizione non viene soddisfatta viene assegnato un valore nullo. Nel caso in cui i valori null non siano consentiti, l'aggiornamento avrà esito negativo. La tua query "efficiente" finale è sql non valido, almeno in TSQL. Hai provato questo su un motore specifico e ha funzionato per te? – pqsk

+0

Questo non funziona. Il valore NULL viene aggiornato. –

+0

L'ho provato su SQL Server 2005 e funziona perfettamente come mostrato. Mi piacerebbe sapere perché è stato rifiutato e un esempio che mostra il valore NULL aggiornato, perché nel mio test precedente, il valore null non viene aggiornato. Ho sempre pensato che la risposta più semplice sia la migliore e se ho a che fare con un database con milioni di record, di sicuro non voglio andare ad aggiornare le righe non necessarie. –

1

enter image description here

voglio cambiare o aggiornare il mio ContactNo a 8.018.070,999 mila dove c'è 8.018.070,777 mila usando istruzione Case

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

enter image description here

+1

per questo motivo, perché non utilizzare questa query UPDATE [Contatti] SET contactNo = 8018070999 WHERE contactNo = 8018070777 – newGuy

Problemi correlati