我有一个简单的选择器,就像这样
SELECT * FROM `table` WHERE fk_id=10020
它能够工作,但是有一些字段是空的。没有规律,所以我不确定该怎么做。
SELECT * FROM `table` WHERE fk_id=10020 AND NOT NULL
尝试只选择所有字段都有数据的结果。
但没有起作用,结果为空,没有带来任何东西。
如何做到这一点-排除在任何字段中具有空值的行结果?
SELECT * FROM `table` where fk_id=10020 and data IS NOT NULL
对于每个需要的列,重复使用<column> IS NOT NULL
应该是这样的:
SELECT *
FROM table
WHERE fk_id = 10020 AND
fk_id IS NOT NULL;
这是一种方法,但是否有一种只用一个命令就能实现的方法,因为如果列很多,它将变得非常庞大。当然,这不是问题,只想知道是否有一种自动化的方法。
有一种方法可以避免指定每个列(也许从性能角度来看并不是最好的方法,但应该足够):
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 │
└────┴───────┴──────┴──────┴──────┘
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;