按x和y状态

时间:2016-02-09 18:00:10

标签: sql-server sql-server-2008 tsql

我有一个表格,其中包含两条消息:xy。用户在发送X之前发送Y,并使用x senty sent更新列。如果用户不需要发送x,但需要发送y,则用户可以发送这些消息。

我需要选择未完成的消息,如xy等于N/ASENT。如果摆放桌子,这将更有意义。

CREATE TABLE myTable (
name varchar(20)
, x varchar(10)
, y varchar(10));

INSERT INTO myTable (name, x, y) 
VALUES 
('JIM', 'X SENT', 'Y N/A'),     -- considered complete
('JEFF', 'X N/A', 'Y N/A'),     -- considered complete
('BOB', 'X SENT', 'Y SENT'),    -- considered complete
('GEO', 'X SENT', 'Y ON-GO'),   -- incomplete/on-going y
('LEO', 'X N/A', 'Y ON-GO')     -- incomplete/on-going y

-- show only complete entries

SELECT *
FROM myTable 
WHERE (X <> 'X N/A' or X <> 'X SENT') 
    AND (Y <> 'Y N/A' or Y <> 'Y SENT')

DROP TABLE myTable;

运行SELECT查询会返回所有结果,包括已完成的消息,而在我的大脑中它应该只返回最后2行。

3 个答案:

答案 0 :(得分:2)

查看你的where子句:

WHERE (X <> 'X N/A' or X <> 'X SENT') AND 
      (Y <> 'Y N/A' or Y <> 'Y SENT')

转换为(使用布尔逻辑):

WHERE NOT(X = 'X N/A' AND X = 'X SENT') AND
      NOT(Y = 'Y N/A' AND Y = 'Y SENT')

X = 'X N/A' AND X = 'X SENT'始终评估为FALSE,因为x不能与两个字符串相同(y相同)。

所以实际上这个短路

WHERE NOT(FALSE) AND NOT(FALSE)

- &GT;

WHERE TRUE

所以这将选择所有行。你可能想写的是:

WHERE (X <> 'X N/A' AND X <> 'X SENT') OR 
      (Y <> 'Y N/A' AND Y <> 'Y SENT')

结果:

+------+--------+---------+
| name |   x    |    y    |
+------+--------+---------+
| GEO  | X SENT | Y ON-GO |
| LEO  | X N/A  | Y ON-GO |
+------+--------+---------+

答案 1 :(得分:1)

我不熟悉MS SQL中的运算符,因为我似乎在尝试使用运算符(&lt;,&gt;)来比较字符串,而不是用数字进行比较。

尝试此查询:

SELECT * FROM mytable WHERE X NOT IN ('X SENT','X N/A') OR Y NOT IN ('Y SENT','Y N/A')

此方法允许您向阵列添加更多项目,以便在将来需要添加更多项目时进行搜索。您也可以将其反转以检查X和Y是否在您要搜索的数组中,如下所示:

SELECT * FROM mytable WHERE X IN ('X SENT','X N/A') OR Y IN ('Y SENT','Y N/A')

这会给你相反的结果,并告诉你哪些结果属于你发送的标准。

这是sqlfiddle的图片: SQLFiddle Example

答案 2 :(得分:0)

只需列出您想要的组合:

( x = 'X SENT' and y = 'Y N/A' ) or
( x = 'X N/A' and y = 'Y N/A' ) or
( x = 'X SENT' and y = 'Y SENT' )

构成所有完整条目。在其周围添加not( )会为您提供不完整的条目。

重要的是,您要检查xy的值,而不是检查x值,然后检查{{1价值。