SQL Server 2005和或者

问题描述:

SELECT * 
FROM T1 INNER JOIN T2 ON T1.C1 = T2.C1 
WHERE 
((T1.C3-T2.C3<>0) 
And (CASE WHEN T1.C4 <> T2.C4 THEN 'Changed' END)) 
OR 
((T1.C5-T2.C5<>0) 
And (T1.C6-T2.C6<>0)) 

这是给我的错误 - >SQL Server 2005和或者

在指定的上下文非布尔类型,其中一个条件的预期,附近“)”的一种表现。

这条语句有什么问题?

+0

解决办法是 - > SELECT * FROM T1 INNER JOIN T2 ON T1.C1 = T2.C1 WHERE ((T1 (T1.C5-T2.C5≠0) (T1.C4-T2.C4 THEN 1 END)= 1) 或 (T1.C5-T2.C5≠0) .C6-T2.C6 0)) – 2012-03-30 09:36:26

看看你在子句中的case语句,case语句不会与任何值进行比较。

我会建议将您的case语句移入select语句,或者确保您有一个值来比较case语句。

即:

declare @Changed nvarchar(50) = 'Changed' 
在where子句

@Changed = (CASE WHEN T1.C4 <> T2.C4 THEN 'Changed' END)) 
+0

在我的SELECT语句中,我将这个CASE比较保存在另一列中。语句是SELECT T1。*,CASE WHEN T1.C4 T2.C4 THEN'已更改'END C10 FROM T1 .. WHERE条件..动机是 - >我必须做这个比较,并保存比较'更改' – 2012-03-30 09:30:22

+0

明白了。生病编写为AND(CASE当T1.C4 T2.C4 THEN 1 END)= 1我想应该解决它。 – 2012-03-30 09:33:52

+0

@rahul shukla这确实是我的意思,你必须将它与某些东西进行比较。 – Lex 2012-03-30 09:35:21

这可能是原因:

And (CASE WHEN T1.C4 <> T2.C4 THEN 'Changed' END)) 

你正在做的东西,可以返回Changed,这不是一个布尔值AND

+0

thats dumb !我从我的查询中的select语句中盲目复制它。谢谢! – 2012-03-30 09:23:50