DECLARE @Table TABLE (CID int, C1 varchar(5), C2 decimal(18,6), C3 decimal(18,6))
INSERT INTO @Table
SELECT 1,'A',0.0,0.0
UNION ALL
SELECT 2,'A',0.1,0.0
UNION ALL
SELECT 3,'A',0.1,0.1
UNION ALL
SELECT 4,'B',0.0,0.0
UNION ALL
SELECT 5,'B',0.1,0.0
UNION ALL
SELECT 6,'B',0.1,0.1
SELECT * FROM @Table
WHERE C1 NOT IN ('B') AND (C2 >= 0 AND C3 >= 0)
/* Desired output
CID C1 C2 C3
1 A 0.0 0.0
2 A 0.1 0.0
3 A 0.1 0.1
4 B 0.0 0.0
*/
如果C2和C3大于0,则不应返回C1 = B的记录。我在弄清楚逻辑时遇到了麻烦。我似乎无法弄清算法。 :(
谢谢
P.S。一个非子查询sln会很棒!
答案 0 :(得分:1)
您的逻辑是:"如果C2 > 0 AND C3 > 0 AND C1 = 'B'
"
取消它,结果是:C2 <= 0 OR C3 <= 0 OR C1 <> 'B'
并使用此条件包含所有其他记录。
注意,如果您打算排除(C2 > 0 OR C3 > 0) AND C1 = 'B'
的记录,那么您将否定其中包含其他记录:(C2 <= 0 AND C3 <= 0) OR C1 <> 'B'
答案 1 :(得分:1)
包含,请考虑您想要的行:
SELECT * FROM @Table WHERE (C1 NOT IN ('B')) OR (C2 <= 0 AND C3 <= 0)
独家,请考虑您不想要的行:
SELECT * FROM @Table WHERE NOT (C1 IN ('B') AND (C2 > 0 OR C3 > 0))
这些是代数等价的,所以选择最好的那个。