MySQL Column为null,但未在SELECT上显示

时间:2017-07-03 12:25:32

标签: php mysql

我有一个产品表,减少到相关列如下:

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的产品。它的teachingIDNULL,typeID为22。但如果我跑:

SELECT * FROM products WHERE teachingID <> 70 AND typeID = 22

我得到零结果。

表格中有两种产品,其中typeID为22,其中一种产品的teachingID为70.另一种产品的teachingIDNULL

如果我删除了teachingID <> 70部分,我当然会得到这两个产品。为什么比较NULL != 70失败?当然NULL不等于70?

3 个答案:

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