在Join中使用Case语句

时间:2013-09-24 10:38:04

标签: sql sql-server database sql-server-2008

大家好我想在联接中使用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

错误

  

'='附近的语法不正确。

请帮我解决这个错误。

5 个答案:

答案 0 :(得分:14)

IT应该是,

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

答案 1 :(得分:7)

我宁愿这样做,而不是使用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。它会起作用,正如其他解决方案提出的那样,但我发现这个版本更容易理解 - 虽然这部分是非常主观的。

答案 2 :(得分: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

答案 3 :(得分:0)

您有语法错误。您在那里缺少END

答案 4 :(得分:0)

您必须了解CASE ... END块与C语言中的IF { }不等效。更确切地说,这相当于来自C语言的... ? ... : ...运算符的复杂版本。这意味着WHOLE CASE块必须基本上计算为单个值,并且无论块的哪种情况执行,该值必须是相同的类型。这意味着:

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进行比较。当然,您可以使用一个WHEN组合而不是4 WHENAND个,OR( )括号。当然在这个特殊情况下@ppeterka 66的答案是正确的,因为CASE不适合你真正想做的事情 - 我只是想澄清CASE到底是什么。

相关问题