连接中的用例语句

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 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个回答

22

应该是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

如果 ACCOUNTTYPE 是5会发生什么?条件会变成 ts.ACCOUNTID = NULL 吗? - Stevoisiak

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 语法要求在子句末尾加上 END。虽然其他提出的解决方案可以工作,但我发现这个版本更易于理解 - 尽管这部分内容高度主观。

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 代码块必须基本上评估为单个值,并且无论执行该块的哪个 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进行比较。当然,您可以使用一个WHENANDOR( )括号的组合,而不是4个WHEN。当然,在这种特殊情况下,@ppeterka 66的答案是正确的,因为CASE不适用于您真正想要做的事情-我只是试图澄清CASE的真正含义。

0

您有语法错误。您缺少END


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接