T-SQL - 有算术缺陷综合症

时间:2015-03-26 18:25:47

标签: sql sql-server tsql

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会很棒!

2 个答案:

答案 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))

这些是代数等价的,所以选择最好的那个。