我有一个表格,其中包含两条消息:x
和y
。用户在发送X
之前发送Y
,并使用x sent
和y sent
更新列。如果用户不需要发送x
,但需要发送y
,则用户可以发送这些消息。
我需要选择仅未完成的消息,如x
和y
等于N/A
或SENT
。如果摆放桌子,这将更有意义。
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行。
答案 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')
这会给你相反的结果,并告诉你哪些结果属于你发送的标准。
答案 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( )
会为您提供不完整的条目。
重要的是,您要检查x
和y
的值对,而不是检查x
值,然后检查{{1价值。