选择所有列都包含数据且不为空的记录

时间:2012-07-11 18:20:30

标签: php mysql null records

我有一个表,其中包含某些列中包含空白/空数据的记录,我想查找记录,其中 ALL 列的值不是blank / null而不创建非常长的SQL语句。

EG:

SELECT * FROM table
WHERE col1 IS NOT NULL AND col2 IS NOT NULL AND col3 IS NOT NULL AND...

有没有办法缩短这个?或者有没有办法以不同的方式执行此操作(可能使用SQL过程?)

8 个答案:

答案 0 :(得分:5)

我唯一要做的就是缩短它:

SELECT * FROM table1 WHERE (val1 AND val2 AND val3 AND val4) IS NOT NULL

答案 1 :(得分:5)

如果您有时只想查看包含所有列中数据的行,我建议creating a view根据您在上面发布的查询。这样你就可以用更优雅,更短的方式与它互动。

视图是一种基于查询的“虚拟表”。如果您经常想要进行某种复杂的加入或过滤,那么使用视图可以大大简化您在其他地方编写的查询。

答案 2 :(得分:1)

总结所有列上的ISNULL函数。

SELECT * FROM table1 WHERE
ISNULL(val1)+ISNULL(val2)+ISNULL(val3)+ISNULL(val4)=0;

如果总计为0,则所有列都有数据

如果您要测试的表只有太多列要检查,并且输入是真正的杂事,请使用INFORMATION_SCHEMA.COLUMN为您创建查询。

我创建了一个名为test.mytable的表,如下所示:

mysql> show create table test.mytable\G
*************************** 1. row ***************************
       Table: mytable
Create Table: CREATE TABLE `mytable` (
  `nid` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `vid` int(10) unsigned NOT NULL DEFAULT '0',
  `type` varchar(32) NOT NULL DEFAULT '',
  `language` varchar(12) NOT NULL DEFAULT '',
  `title` varchar(255) NOT NULL DEFAULT '',
  `uid` int(11) NOT NULL DEFAULT '0',
  `status` int(11) NOT NULL DEFAULT '1',
  `created` int(11) NOT NULL DEFAULT '0',
  `changed` int(11) NOT NULL DEFAULT '0',
  `comment` int(11) NOT NULL DEFAULT '0',
  `promote` int(11) NOT NULL DEFAULT '0',
  `moderate` int(11) NOT NULL DEFAULT '0',
  `sticky` int(11) NOT NULL DEFAULT '0',
  `tnid` int(10) unsigned NOT NULL DEFAULT '0',
  `translate` int(11) NOT NULL DEFAULT '0',
  PRIMARY KEY (`nid`),
  UNIQUE KEY `vid` (`vid`),
  KEY `node_changed` (`changed`),
  KEY `node_created` (`created`),
  KEY `node_moderate` (`moderate`),
  KEY `node_promote_status` (`promote`,`status`),
  KEY `node_status_type` (`status`,`type`,`nid`),
  KEY `node_title_type` (`title`,`type`(4)),
  KEY `node_type` (`type`(4)),
  KEY `uid` (`uid`),
  KEY `tnid` (`tnid`),
  KEY `translate` (`translate`)
) ENGINE=InnoDB AUTO_INCREMENT=73798 DEFAULT CHARSET=utf8
1 row in set (0.00 sec)

您可以使用以下语句为此表生成查询

SET @MyDB = 'test';
SET @MyTB = 'mytable';
SELECT CONCAT(GROUP_CONCAT(CONCAT('ISNULL(',column_name,')') SEPARATOR '+'),'=0')
INTO @WhereClause FROM information_schema.columns
WHERE table_schema=@MyDB AND table_name=@MyTB;
SET @SQLStmt = CONCAT('SELECT * FROM ',@MyDB,'.',@MyTB,' WHERE ',@WhereClause);
SELECT @SQLStmt\G

让我们运行这些语句,看看生成了什么SQL

mysql> SET @MyDB = 'test';
Query OK, 0 rows affected (0.00 sec)

mysql> SET @MyTB = 'mytable';
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT CONCAT(GROUP_CONCAT(CONCAT('ISNULL(',column_name,')') SEPARATOR '+'),'=0')
    -> INTO @WhereClause FROM information_schema.columns
    -> WHERE table_schema=@MyDB AND table_name=@MyTB;
Query OK, 1 row affected (0.00 sec)

mysql> SET @SQLStmt = CONCAT('SELECT * FROM ',@MyDB,'.',@MyTB,' WHERE ',@WhereClause);
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT @SQLStmt\G
*************************** 1. row ***************************
@SQLStmt: SELECT * FROM test.mytable WHERE ISNULL(nid)+ISNULL(vid)+ISNULL(type)+ISNULL(language)+ISNULL(title)+ISNULL(uid)+ISNULL(status)+ISNULL(created)+ISNULL(changed)+ISNULL(comment)+ISNULL(promote)+ISNULL(moderate)+ISNULL(sticky)+ISNULL(tnid)+ISNULL(translate)=0
1 row in set (0.00 sec)

mysql>

从那里,只需使用PREPARE执行SQL或将SQL传递给PHP mysql_query

答案 3 :(得分:0)

另一种方法是

SELECT * FROM table1 WHERE val1 AND val2 AND val3 AND val4 is <> '';

这可能会略短一些。只需确保引号之间没有空格。

答案 4 :(得分:0)

另一种添加如下列

的方法
SELECT * 
FROM table1 
WHERE (val1 + val2 + val3) IS NOT NULL

如果任何列不是字符数据类型,则必须使用强制转换函数将该列转换为char

答案 5 :(得分:0)

没有办法缩短它,但下面的查询可以使它对任何表都是通用的。

DECLARE @tb NVARCHAR(255) = N'table1';

DECLARE @sql NVARCHAR(MAX) = N'SELECT * FROM ' + @tb
    + ' WHERE 1 = 1';

SELECT @sql += N' AND ' + QUOTENAME(name) + ' IS NOT NULL'
    FROM sys.columns 
    WHERE [object_id] = OBJECT_ID(@tb);

EXEC sp_executesql @sql;

将'table1'替换为您要查询的表的名称,您将获得结果。

这个动态sql基本上查询sys.columns表以获取属于该表的所有列,并将IS NOT NULL条件追加到它。

答案 6 :(得分:0)

SELECT *
FROM table1
WHERE CONCAT(val1, val2, val3, ...) is not Null

答案 7 :(得分:0)

SELECT * FROM YOUR_TABLE where ((select REPLACE(WM_CONCAT(distinct COLUMN_NAME),',',' IS NOT NULL AND ') from all_tab_columns where OWNER = 'OWNER_DEV' and TABLE_NAME = 'YOUR_TABLE' ||'is not null' )) is not null;

请务必更改:

  >> 1- YOUR_TABLE   by   the name of your table                                             
  >> 2- OWNER_DEV    by   the name of your owner