大家好我想在联接中使用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
错误
'='附近的语法不正确。
请帮我解决这个错误。
答案 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)
你可以这样做,所以你没有机会拼错一些东西(注意ACCOUNTTYPE
和ACCOUNTID
仅在需要时使用,你不必复制粘贴它)
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 WHEN
。 AND
个,OR
和( )
括号。当然在这个特殊情况下@ppeterka 66的答案是正确的,因为CASE
不适合你真正想做的事情 - 我只是想澄清CASE
到底是什么。