2016-06-14 37 views
23

ho questo Struttura della tabella prices:caso quando un valore è diverso da un altro valore, SQL Server

CREATE TABLE prices 
(
    id int, 
    priceFrom int, 
    priceUp int 
); 

INSERT INTO prices (id, priceFrom, priceUp) 
VALUES (1, 23, 23), (2, 0, 0), (3, 12, 13), 
     (4, 40, 40), (5, 15, 15), (6, 0, 0); 

Questo è il risultato:

enter image description here

ho questa query:

select 
    pricefrom, priceup, 
    case 
     when pricefrom = 0 then null 
     when priceFrom <> priceUp then priceFrom + ' - ' + priceUp 
     when priceFrom = priceUp then priceFrom 
    end as FinalPrice 
from 
    prices 

quello che mi serve è fare un caso quando

  1. pricefrom = 0 mostrano quindi nullo
  2. pricefrom = priceup poi mostrare il prezzo
  3. Almeno se pricefrom = priceup voglio mostrare ad esempio questo:! 12 (pricefrom) - 13 (priceup)

ma nella mia interrogazione in questa linea:

enter image description here

cerco di fare questo con <> ma nel risultato appare la somma di entrambi i numeri:

enter image description here

Come posso risolvere questo problema?

+3

'quando pricefrom <> priceUp poi gettato (pricefrom come varchar) + '-' + cast (priceUp come varchar)'? – potashin

+0

'Cast' to' Varchar' – Wanderer

+4

E lancia anche il 'THEN priceFrom' sulla riga sottostante. * Non * avere più tipi di dati diversi che escono da un'istruzione 'CASE'. Le conversioni implicite sono un bugger. – MatBailie

risposta

10

Penso che tu stia cercando la funzione concat qui.

select pricefrom, priceup, 
case 
when pricefrom = 0 then null 
when priceFrom <> priceUp then concat(priceFrom, ' - ', priceUp) 
when priceFrom = priceUp then cast(priceFrom as varchar(8)) 
end as FinalPrice 
from prices 

Questo collegamento sarà probabilmente utile

MySQL combine two columns into one column

+1

@ aakashgupta.0205 Viene visualizzato questo messaggio di errore: Conversione non riuscita durante la conversione del valore varchar '12 - 13 'nel tipo di dati int. –

+0

Le mie scuse. Un'istruzione case può restituire solo un tipo di dati. Puoi provare ora? –

+5

'CONCAT()' funzionerà solo sulle versioni 2012+. – sagi

6

Devi CAST-VARCHAR:

select pricefrom, priceup, 
     case 
      when pricefrom = 0 then null 
      when priceFrom <> priceUp then concat(cast(priceFrom as varchar(8)), 
               ' - ', 
               cast(priceUp as varchar(8))) 
      when priceFrom = priceUp then cast(priceFrom as varchar(8)) 
     end as FinalPrice 
from prices 
1

Si dovrebbe lanciare i campi di prezzo come stringa in modo che SQL capisce che non si desidera per il trattamento di loro come i numeri e fare un'operazione matematica:

select pricefrom, priceup, 
case 
when pricefrom = 0 then null 
when priceFrom <> priceUp then cast(priceFrom as varchar) + ' - ' + cast(priceUp as varchar) 
when priceFrom = priceUp then priceFrom 
end as FinalPrice 
from prices 
+1

Il tuo codice restituisce questo messaggio di errore: Conversione fallita durante la conversione del valore varchar '12 - 13 'nel tipo di dati int. –

+1

@ Esraa_92 Sì, anche il 'prezzoDa caso 'dovrebbe essere' cast', altrimenti si verificherà la coercizione. –

7

Non hai fornito l'errore, ma dal formato del tuo CASE EXPRESSION presumo che stia generando un errore a causa della conversione.

Si dovrebbe usare CAST to VARCHAR:

select pricefrom, priceup, 
     case 
      when pricefrom = 0 then '' 
      when priceFrom <> priceUp then CAST(priceFrom as varchar(10)) + ' - ' + CAST(priceUp as varchar(10)) 
      when priceFrom = priceUp then CAST(priceFrom as varchar(10)) 
     end as FinalPrice 
from prices 

non sono sicuro circa la prima WHEN, ma si deve sapere che:

di solito la prima condizione di una CASE EXPRESSION sarà determinerà il tipo di la colonna, quindi, se il primo THEN posiziona un numero intero, questa colonna sarà un numero intero.

dal momento che si sta mettendo valore nullo in esso, io non sono sicuro di quale tipo la colonna verrà valutato per, quindi può ancora gettare un errore, ma si può fare un tentativo:

  when pricefrom = 0 then null 

Nota: Come risposta @ aakashpugta.0205, utilizzando CONCAT() la conversione è automatica, ma è necessario sapere che CONCAT() è disponibile su SQL-Server solo dal 2012, quindi nelle versioni precedenti non funzionerà!

Consentitemi anche di riferirvi a un articolo interessante su CASE EXPRESSION secrets.

+0

emetterà errori di conversione – mohan111

+0

@ mohan111 Prova ora – sagi

+0

quindi funzionerà perché hai modificato le condizioni di riposo – mohan111

Problemi correlati