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 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

错误

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

请帮我解决这个错误。

4

5 回答 5

17

它应该是,

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
于 2013-09-24T10:40:54.860 回答
9

而不是使用 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需要 an的语法。END正如其他解决方案所建议的那样,它会起作用,但我发现这个版本更容易理解——尽管这部分是非常主观的。

于 2013-09-24T10:42:51.903 回答
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
于 2013-09-24T10:51:31.960 回答
0

你有语法错误。你在那里失踪END了。

于 2013-09-24T10:42:21.363 回答
0

您必须了解CASE ... ENDblock 不等同于IF { }from 类 C 语言。更确切地说,这相当于... ? ... : ...来自类 C 语言的精心制作的运算符版本。这意味着整个CASE块必须本质上评估为单个值,并且无论执行块的哪种情况,该值都必须是相同的类型。这意味着:

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

基本上是不正确的,除非您使用的数据库版本允许您将布尔值作为值(例如 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您可以使用'、' 和括号的WHEN组合来代替 4 。当然,在这种特殊情况下,@ppeterka 66 的回答是正确的,因为它不适合你真正想做的事情——我只是想弄清楚到底是什么。ANDOR( )CASECASE

于 2013-09-24T11:04:30.767 回答