2013-09-24 47 views
5

喜每一個我想使用聯接使用此查詢case語句,並得到錯誤用例聲明中加入

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 

錯誤

附近有語法錯誤「=」。

請幫我解決這個錯誤。

回答

13

它應該是,

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

你有語法錯誤。那裏你缺少END

6

而不是使用CASE,我寧願這樣做:

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) 

要解釋爲什麼查詢沒有爲你工作:CASE的語法要求的END在條款的最後。正如提出的其他解決方案所暗示的那樣,它會起作用,但我覺得這個版本更容易理解 - 儘管這部分是非常主觀的。

+0

你使查詢工作,但你沒有完全解釋錯誤的原因是什麼。 – nimdil

1

你可以做到這一點,那麼你就沒有機會拼錯的東西(注:ACCOUNTTYPEACCOUNTID只用在需要的時候,你不必複製粘貼)

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

你必須明白, CASE ... END塊不等同於類似C語言的IF { }。更重要的是,這相當於從類似C語言的精心製作的... ? ... : ...運算符版本。這意味着整個塊必須基本評估爲單個值,並且無論執行塊的哪種情況,該值必須是相同的類型。這意味着:

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

根本不正確,除非你上一個版本的數據庫,讓您bool值的值(SQL Server將不會允許它例如工作,但我覺得有些MySQL版本使用允許它 - 不知道這一點)。你或許應該寫類似:

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 

注意整個CASE塊如何評估爲1或0,然後它是相對於1。當然,而不是4 WHEN的,你可以使用一個WHENAND組合's,OR'和()括號。當然,在這個特殊情況下,@ppeterka 66的回答是正確的,因爲CASE不適合你真正想做的事情 - 我只是試圖澄清CASE究竟是什麼。