2013-07-01 27 views
9

伪:有没有办法在通配符选择的所有列上测试null?

select * from foo where [every column is not null] 

有没有办法做到这一点,而无需指定的实际列名称?

+1

恐怕没有 - 你有他们的名字全部。 –

+0

只是一个问题,你为什么不知道你的表的名字? – bugwheels94

+0

@Ankit,碰巧我正在处理一个动态派生表,它可以有各种各样的列和各种各样的名字。当然,我可以构建一个精细而又丑陋的AND串,但希望避免这种(我认为你的意思是我的专栏名称)。 –

回答

6

,我能想到的一种可能的解决方案包括使用动态-SQL

SELECT GROUP_CONCAT(column_name SEPARATOR ' IS NOT NULL AND ') 
    INTO @sql 
    FROM INFORMATION_SCHEMA.COLUMNS 
WHERE table_schema = SCHEMA() 
    AND table_name = 'foo' 
GROUP BY table_name; 

SET @sql = CONCAT('SELECT * FROM foo WHERE ', @sql, ' IS NOT NULL'); 

PREPARE stmt FROM @sql; 
EXECUTE stmt; 
DEALLOCATE PREPARE stmt; 

在这里被SQLFiddle演示


显然它可以被包装成带有参数的存储过程表名

DELIMITER $$ 
CREATE PROCEDURE sp_select_all_not_null(IN tbl_name VARCHAR(64)) 
BEGIN 
    SELECT GROUP_CONCAT(column_name SEPARATOR ' IS NOT NULL AND ') 
    INTO @sql 
    FROM INFORMATION_SCHEMA.COLUMNS 
    WHERE table_schema = SCHEMA() 
    AND table_name = tbl_name 
    GROUP BY table_name; 

    SET @sql = CONCAT('SELECT * FROM ', tbl_name, ' WHERE ', @sql, ' IS NOT NULL'); 

    PREPARE stmt FROM @sql; 
    EXECUTE stmt; 
    DEALLOCATE PREPARE stmt; 
END 
DELIMITER ; 

,然后用它

CALL sp_select_all_not_null('foo'); 

这里是SQLFiddle演示为

+0

啊......这很酷。我会试一试。谢谢。 –

+0

@ Dr.Dredel你不止欢迎:)给它一个旋转。你也可以看看我发布的sqlfiddle示例。 – peterm

相关问题