【问题标题】:Exclude lines results that have NULL value in any field?排除在任何字段中具有 NULL 值的行结果?
【发布时间】:2012-08-03 12:00:37
【问题描述】:

我有一个像这样的简单选择

SELECT * FROM `table` WHERE fk_id=10020

这是可行的,但有些字段是 NULL。没有这样的模式

SELECT * FROM `table` WHERE fk_id=10020 AND NOT NULL

试图只选择所有字段都包含数据的结果。

但是没有用,Results in a Empty Results,它没有带来任何东西。

我该如何做到这一点 - 排除在任何字段中具有空值的行结果?

【问题讨论】:

    标签: mysql sql


    【解决方案1】:

    试试

    SELECT * FROM `table` where fk_id=10020 and data IS NOT NULL
    

    对您需要的每一列重复<column> IS NOT NULL

    【讨论】:

    • 这是一种方法,但是有没有办法只用一个命令来做到这一点,因为如果有很多列,它会变得很大。当然这不是问题,只是想知道有没有办法自动化这个......
    • 据我所知,您无法在 SQL 级别实现自动化。可能在 java\php\python 写小方法(无论你使用什么)都会帮助你
    • @xander27 实际上在纯 MySQL 中是可行的
    【解决方案2】:

    应该是:

    SELECT * 
    FROM table 
    WHERE fk_id = 10020 AND
          fk_id IS NOT NULL;
    

    【讨论】:

      【解决方案3】:

      Comment

      这是一种方法,但有没有办法只用一个命令来做到这一点,因为如果有很多列,它会变得很大。当然这不是问题,只是想知道是否有办法将其自动化。

      有一种方法可以避免指定每一列(从性能的角度来看可能不是最好的,但应该绰绰有余):

      CREATE TABLE tab(id INT PRIMARY KEY,fk_id INT,col1 CHAR(9),col2 CHAR(9),col3 INT)
      
      INSERT INTO tab(id, fk_id, col1, col2, col3)
      VALUES
      (1,10020,'a','b',100),
      (2,10020,'a2','b2',NULL),
      (3,10020,'a3',NULL,300),
      (4,10020,NULL, 'b4',400),
      (5,10020,NULL, NULL,500),
      (6,10020,NULL, NULL,NULL),
      (7,10020,'a7','b7', 700);
      
      SELECT * FROM tab where fk_id=10020;
      
      ┌────┬───────┬──────┬──────┬──────┐
      │ id │ fk_id │ col1 │ col2 │ col3 │
      ├────┼───────┼──────┼──────┼──────┤
      │  1 │ 10020 │ a    │ b    │ 100  │
      │  2 │ 10020 │ a2   │ b2   │ null │
      │  3 │ 10020 │ a3   │ null │ 300  │
      │  4 │ 10020 │ null │ b4   │ 400  │
      │  5 │ 10020 │ null │ null │ 500  │
      │  6 │ 10020 │ null │ null │ null │
      │  7 │ 10020 │ a7   │ b7   │ 700  │
      └────┴───────┴──────┴──────┴──────┘
      

      最后的查询:

      SELECT * FROM tab t1 NATURAL JOIN tab t2 WHERE t1.fk_id=10020;
      
      ┌────┬───────┬──────┬──────┬──────┐
      │ id │ fk_id │ col1 │ col2 │ col3 │
      ├────┼───────┼──────┼──────┼──────┤
      │  1 │ 10020 │ a    │ b    │  100 │
      │  7 │ 10020 │ a7   │ b7   │  700 │
      └────┴───────┴──────┴──────┴──────┘
      

      DBFiddle Demo


      据我所知,您无法在 SQL 级别实现自动化。可能会在 java\php\python 上写一些小方法(无论你使用什么)都会对你有所帮助-@xander27

      另一种方法是准备语句并基于 INFORMATION_SCHEMA 元数据构建 SQL 查询。

      SET @s = 
      (SELECT CONCAT('SELECT * FROM tab WHERE fk_id=? ',
              GROUP_CONCAT(CONCAT('AND ',COLUMN_NAME, ' IS NOT NULL ') SEPARATOR ''))
      FROM INFORMATION_SCHEMA.COLUMNS
      WHERE TABLE_NAME = 'tab');
      
      PREPARE stmt2 FROM @s;
      SET @a = 10020;
      EXECUTE stmt2 USING @a;
      DEALLOCATE PREPARE stmt2;
      

      DBFiddle Demo2

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-06-01
        • 2014-10-10
        • 2020-09-03
        • 2015-09-27
        • 2018-04-20
        • 1970-01-01
        • 2023-04-06
        相关资源
        最近更新 更多