Sql 联接中的用例语句
大家好,我想使用这个查询在join中使用case语句,但出现了错误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
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{}
。更确切地说,这相当于复杂版本的类似C语言的代码>运算符。这意味着整个案例
块基本上必须计算为单个值,并且无论执行该块的哪种案例,该值必须是相同的类型。这意味着:
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