【问题标题】:MYSQL query to exclude column with null value in the resultMYSQL查询以排除结果中具有空值的列
【发布时间】:2020-06-13 06:35:30
【问题描述】:

场景是我有两个表,我想使用使用 PHP 的搜索功能来查询它们。有两个表,table_a 和 table_b。在 table_a 中,它有 id、name、middle_name、surname、case_no 列,而 table_b 是相似的。 table_b 中的数据都是从其他来源导入的,而 table_a 数据是用户手动插入的。存在 table_a 和 table_b 中存在重复数据的情况。我想要的是从 table_b 中删除重复的数据。假设在 table_a 中有一个具有空值的列,我想要从结果中排除它。

+----------+----------+----------+     +----------+----------+----------+
| name     | surname  | case_num |     | name     | surname  | case_num |
+----------+----------+----------+     +----------+----------+----------+
|  john    |  wick    |  1434    |     |  john    |  wick    |  null    |
+----------+----------+----------+     +----------+----------+----------+
      table_a                                  table_b

我现在所做的是创建一个视图并使用 Union 将两者结合在一起。它现在看起来像这样。

+----------+----------+----------+     
| name     | surname  | case_num |     
+----------+----------+----------+     
|  john    |  wick    |  1434    |     
+----------+----------+----------+ 
|  john    | wick     |  null    |
+----------+----------+----------+

现在我想要的是查询这个表并只显示没有空值的结果

+----------+----------+----------+     
|  john    |  wick    |  1434    |     
+----------+----------+----------+

如果可以自动删除具有空值的行

+----------+----------+----------+     
|  john    |  wick    |  null    |     
+----------+----------+----------+

但第一个问题是从结果中排除具有空值的行。这是我的查询。

SELECT * FROM created_view_table WHERE name LIKE ? OR surname LIKE ? OR case_num LIKE ? AND 
case_num <> null;

SELECT * FROM created_view_table WHERE name LIKE ? OR surname LIKE ? OR case_num LIKE ? AND 
case_num IS NOT null;

每当我搜索“%john%”时,它总是显示两个 row ,一个具有空值的列,一个没有。如果可能的话,我只想显示没有空值的结果。

【问题讨论】:

  • 试试这个SELECT * FROM created_view_table WHERE (name LIKE ? OR surname LIKE ? OR case_num LIKE ?) AND case_num IS NOT null;

标签: php mysql null


【解决方案1】:

您正在使用 or 子句,因此您需要用 or 将查询括起来并尝试在下面进行

select * from created_view_table WHERE (name LIKE ? OR 
surname LIKE ? OR case_num LIKE ?) AND  case_num is not null;

这将解决您的问题。

【讨论】:

  • 嘿,我可以做一个后续问题吗?如果我只想排除具有重复值的空值列怎么办?就像在示例中一样,它们都是“约翰威克”,因此它们是重复的,我排除了具有空值的那个。如果场景是有两个'john'但姓不同,一个是'john wick',另一个是'john mcclane',但是'john mcclane'有一个空值,但我不想排除他。跨度>
  • 据我所知,您只想排除具有重复列的空列,但如果名称和姓氏不同,则不想排除?
  • 是的,如果可能的话,在上面的代码中,如果我查询 '%john%' 它将排除具有空值的 'john wick' 并且只显示没有空值的 'john wick',但是什么如果有另一个条目另一个 'john' 但这次它的姓氏是 'macclane' 这与 'wick' 不同,所以它不是重复的,但 'john macclane' 有一个空值,所以查询将他排除在结果中,有没有办法不排除它,因为它在另一个表中没有重复?
  • 进一步详细说明,'john wick 1434' 在 table_a 中,而 'john wick null' 在 table_b 中,所以我们排除 'john wick null' 因为,首先它是 null,其次它有重复在 table_a 中,即“john wick 1434”。但是,如果 table_b 中有另一个 'john',即 'john macclane null',也是 null,但姓氏不同,并且在 table_a 中没有重复项,该怎么办。在我们的查询中,它会被排除,因为它是空的,有没有办法只排除它,如果它在 table_a 中有重复(相似的名字和姓氏,在某种意义上相似的人)?
  • 此外,我在想,我使用 UNION 创建了 VIEW 表,我读到 UNION 可以删除重复项?这是对的吗?怎么做?我创建视图的查询是“CREATE VIEW created_view_table AS SELECT name, surname, case_num FROM table_a UNION SELECT name, surname, case_num FROM table_b;”
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-02
  • 1970-01-01
  • 2012-01-31
  • 1970-01-01
相关资源
最近更新 更多