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

3

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

SELECT * FROM `table` WHERE fk_id=10020

它能够工作,但是有一些字段是空的。没有规律,所以我不确定该怎么做。

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

尝试只选择所有字段都有数据的结果。

但没有起作用,结果为空,没有带来任何东西。

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

3个回答

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

对于每个需要的列,重复使用<column> IS NOT NULL


这是一种方法,但是否有一种只使用一个命令就可以完成的方式呢?因为如果有很多列,那么代码会变得非常庞大。当然这不是问题,只是想知道是否有自动化的方法... - JGSilva
1
据我所知,你无法在SQL层面上自动化。也许编写一些小的方法在Java\PHP\Python(无论你使用哪种语言)中会有所帮助。 - xander27
@xander27 实际上在纯MySQL中是可行的。 - Lukasz Szozda

1

应该是这样的:

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

0

评论

这是一种方法,但是否有一种只用一个命令就能实现的方法,因为如果列很多,它将变得非常庞大。当然,这不是问题,只想知道是否有一种自动化的方法。

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

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 │
├────┼───────┼──────┼──────┼──────┤
│  110020 │ a    │ b    │ 100  │
│  210020 │ a2   │ b2   │ null │
│  310020 │ a3   │ null300  │
│  410020null │ b4   │ 400  │
│  510020nullnull500  │
│  610020nullnullnull │
│  710020 │ a7   │ b7   │ 700  │
└────┴───────┴──────┴──────┴──────┘

最后的查询:

SELECT * FROM tab t1 NATURAL JOIN tab t2 WHERE t1.fk_id=10020;

┌────┬───────┬──────┬──────┬──────┐
│ id │ fk_id │ col1 │ col2 │ col3 │
├────┼───────┼──────┼──────┼──────┤
│  110020 │ a    │ b    │  100 │
│  710020 │ a7   │ b7   │  700 │
└────┴───────┴──────┴──────┴──────┘

DBFiddle演示


据我所知,你无法在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演示2


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接