2013-09-24 15 views
5

Ciao a tutti voglio usare istruzione case in join utilizzando questa query e ha ricevuto l'errorecaso d'uso Dichiarazione Registrazione

Select CONVERT(VARCHAR(10), SII.SIDATE,103)DATE,SII.SALEID,SII.ItemName,SI.TenancyID 

FROM F_SALESINVOICEITEM SII 
INNER JOIN F_SALESINVOICE SI ON SI.SALEID=SII.SALEID 
INNER JOIN #TempTableSearch ts ON CASE 
WHEN ts.ACCOUNTTYPE = '1' THEN ts.ACCOUNTID=SI.TENANCYID 
    WHEN ts.ACCOUNTTYPE='2' THEN ts.ACCOUNTID=SI.EMPLOYEEID 
    WHEN ts.ACCOUNTTYPE='3' THEN ts.ACCOUNTID=SI.SUPPLIERID 
    WHEN ts.ACCOUNTTYPE='4' THEN ts.ACCOUNTID=SI.SALESCUSTOMERID 

errore

sintassi corretta accanto a '='.

Please help me per risolvere questo errore.

risposta

13

Va,

ON 
ts.ACCOUNTID = CASE 
        WHEN ts.ACCOUNTTYPE = '1' THEN SI.TENANCYID 
        WHEN ts.ACCOUNTTYPE = '2' THEN SI.EMPLOYEEID 
        WHEN ts.ACCOUNTTYPE = '3' THEN SI.SUPPLIERID 
        WHEN ts.ACCOUNTTYPE = '4' THEN SI.SALESCUSTOMERID 
       END 
0

avete errore di sintassi. Ti manca END lì.

6

Invece di usare caso, mi piacerebbe molto meglio fare questo:

Select CONVERT(VARCHAR(10), SII.SIDATE,103)DATE,SII.SALEID,SII.ItemName,SI.TenancyID 
FROM F_SALESINVOICEITEM SII 
INNER JOIN F_SALESINVOICE SI ON SI.SALEID=SII.SALEID 
INNER JOIN #TempTableSearch ts ON 
     (ts.ACCOUNTTYPE='1' AND ts.ACCOUNTID=SI.TENANCYID) 
    OR (ts.ACCOUNTTYPE='2' AND ts.ACCOUNTID=SI.EMPLOYEEID) 
    OR (ts.ACCOUNTTYPE='3' AND ts.ACCOUNTID=SI.SUPPLIERID) 
    OR (ts.ACCOUNTTYPE='4' AND ts.ACCOUNTID=SI.SALESCUSTOMERID) 

di spiegare perché la query non ha funzionato per voi: la sintassi del CASE richiede un END alla fine della clausola . Funzionerebbe, come suggeriscono le altre soluzioni proposte, ma trovo che questa versione sia più comoda da capire - sebbene questa parte sia altamente soggettiva.

+0

Hai eseguito la query ma non hai spiegato esattamente quale fosse il motivo dell'errore. – nimdil

1

si può fare questo, in modo da avere nessuna possibilità di errori ortografici qualcosa (si noti che ACCOUNTTYPE e ACCOUNTID utilizzato solo quando necessario, non c'è bisogno di copiare e incollare esso)

select 
    convert(varchar(10), SII.SIDATE,103) as DATE, 
    SII.SALEID, SII.ItemName, SI.TenancyID 
from F_SALESINVOICEITEM as SII 
    inner join F_SALESINVOICE as SI on SI.SALEID = SII.SALEID 
    outer apply (
     '1', SI.TENANCYID 
     '2', SI.EMPLOYEEID 
     '3', SI.SUPPLIERID 
     '4', SI.SALESCUSTOMERID 
    ) as C(ACCOUNTTYPE, ACCOUNTID) 
    inner join #TempTableSearch as ts on 
     ts.ACCOUNTTYPE = C.ACCOUNTTYPE and ts.ACCOUNTID = C.ACCOUNTID 
0

Dovete capire che Il blocco CASE ... END NON è equivalente a IF { } da lingue simili a C. Molto più questo è equivalente alla versione elaborata dell'operatore ... ? ... : ... dalle lingue simili a C. Cosa significa che il blocco INTERO CASE deve essenzialmente valutare il valore singolo e che questo valore deve essere dello stesso tipo, indipendentemente dal caso in cui il blocco viene eseguito. Ciò significa che:

CASE 
WHEN ts.ACCOUNTTYPE = '1' THEN ts.ACCOUNTID=SI.TENANCYID ... 
END 

è fondamentalmente errata a meno che non si lavora su una versione di base di dati che vi permetterà bool valore come un valore (SQL Server non lo permetterà, ad esempio, ma credo che alcuni di versione di MySQL utilizzati per permettilo - non sono sicuro di questo). Probabilmente si dovrebbe scrivere qualcosa come:

CASE 
WHEN ts.ACCOUNTTYPE = '1' AND ts.ACCOUNTID=SI.TENANCYID THEN 1 
WHEN ts.ACCOUNTTYPE='2' AND ts.ACCOUNTID=SI.EMPLOYEEID THEN 1 
WHEN ts.ACCOUNTTYPE='3' AND ts.ACCOUNTID=SI.SUPPLIERID THEN 1 
WHEN ts.ACCOUNTTYPE='4' AND ts.ACCOUNTID=SI.SALESCUSTOMERID THEN 1 
ELSE 0 
END = 1 

Notate come l'intero CASE blocco restituisce 1 o 0 e poi si è paragonato a 1. Naturalmente, invece di 4 WHEN s' è possibile utilizzare uno WHEN con la combinazione di AND 's, OR' s e () parentesi. Ovviamente in questo caso specifico la risposta di @ppeterka 66 è corretta poiché CASE non è adatto per quello che volevi veramente fare - sto solo cercando di chiarire cosa sia veramente CASE.

Problemi correlati