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

Gen*_* S. 9 mysql

伪:

select * from foo where [every column is not null]
Run Code Online (Sandbox Code Playgroud)

有没有办法在不指定实际列名的情况下执行此操作?

pet*_*erm 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;
Run Code Online (Sandbox Code Playgroud)

这是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 ;
Run Code Online (Sandbox Code Playgroud)

然后使用它

CALL sp_select_all_not_null('foo');
Run Code Online (Sandbox Code Playgroud)

这是SQLFiddle的演示