我有一个产品表,减少到相关列如下:
CREATE TABLE `products` (
`id` int(11) NOT NULL,
`name` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT 'Name',
`teachingID` int(11) DEFAULT NULL COMMENT 'Teaching',
`typeID` int(11) DEFAULT NULL COMMENT 'Product Type',
`ts` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
(我不知道如何把桌子画好,就像我看到有人做的那样)
所以,我在表中有一个名为Business Cards
的产品。它的teachingID
为NULL
,typeID为22
。但如果我跑:
SELECT * FROM products WHERE teachingID <> 70 AND typeID = 22
我得到零结果。
表格中有两种产品,其中typeID
为22,其中一种产品的teachingID
为70.另一种产品的teachingID
为NULL
如果我删除了teachingID <> 70
部分,我当然会得到这两个产品。为什么比较NULL != 70
失败?当然NULL
不等于70?
答案 0 :(得分:0)
不确定你在期待什么,但我会写出在所有情况下都会发生的解决方案。
SELECT * FROM products WHERE teachingID= 70 ANDtypeID= 22
这给你70项
SELECT * FROM products WHERE teachingID <> 70 ANDtypeID= 22
这个teoricaly应该给你所有的70个项目,换句话说,你唯一的一个,null。然而,它可能仅适用于数字,因为null inst不会计算数字。为了测试这个,我建议你在表中添加另一行。
答案 1 :(得分:0)
为什么比较NULL!= 70失败?
这是因为你无法将NULL
与等值运算符进行比较;不仅包含其他一些值,还包含NULL
,以及为什么存在IS NULL
运算符,因此您应该检查您的条件是否为
SELECT *
FROM products
WHERE (teachingID <> 70 OR teachingID IS NULL)
AND typeID = 22
或者,只需使用空合并函数COALESCE()
,如
SELECT *
FROM products
WHERE COALESCE(teachingID,0) <> 70
AND typeID = 22
答案 2 :(得分:0)
正如您现在应该知道的,NULL与任何值都不同。在SQL中,您可以使用ISNULL检查它的值(例如,WHERE teachingID为NULL)。当然你可以像上面建议的那样使用COALESCE()函数。
如果你想使用某个typeID的所有teachingId&lt;&gt; 70 OR = NULL你可以使用(注意优先级和/或使用括号,但我现在应该这样做,因为它在大多数编程语言中都是类似的):
container