排除任何字段中具有NULL值的行结果?

时间:2012-08-03 12:00:37

标签: mysql sql

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

SELECT * FROM `table` WHERE fk_id=10020

它有效,但有些字段为NULL。没有一种模式,所以

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

尝试仅选择包含所有数据字段的结果。

但没有奏效,结果为空结果,没带任何东西。

我怎么能这样做 - 在任何字段中排除具有空值的行结果?

3 个答案:

答案 0 :(得分:3)

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

为您需要的每一栏重复<column> IS NOT NULL

答案 1 :(得分:1)

应该是:

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

答案 2 :(得分:0)

  

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