Sql 联接中的用例语句

Sql 联接中的用例语句,sql,sql-server,database,sql-server-2008,Sql,Sql Server,Database,Sql Server 2008,大家好,我想使用这个查询在join中使用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

大家好,我想使用这个查询在join中使用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
错误

“=”附近的语法不正确

请帮我解决这个错误。

应该是

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

你有语法错误。您缺少
END

与其使用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
。正如提出的其他解决方案所建议的那样,它会起作用,但我发现这个版本更便于理解——尽管这部分内容非常主观。

您可以这样做,因此您没有机会拼写错误(请注意,
ACCOUNTTYPE
ACCOUNTID
仅在需要时使用,您不必复制粘贴它)


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

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

请注意整个
案例
块如何计算为1或0,然后将其与1进行比较。当然,当
时,您可以使用一个当与组合时,
与()括号,而不是4个
。当然,在这个特殊的案例中,@ppeterka 66的回答是正确的,因为
case
不适合您真正想要做的事情-我只是想澄清
case
到底是什么。

如果
ACCOUNTTYPE
是5,会发生什么?条件是否会变成
ts.ACCOUNTID=NULL
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