2012-07-11 45 views
6

我有一个记录在某些列中有空白/空数据的表,并且我想查找其中所有列都具有非空值/空值而不创建的记录一个非常长的SQL语句。选择所有列都有数据且不为空的记录

EG:

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

有什么办法缩短这个?或者有没有办法做到这一点不同

+0

这是显而易见的方式......我很好奇,看看是否有人可以想出一个聪明的速记,但。 (虽然我怀疑你的方法将是最有效的) – Flimzy 2012-07-11 18:23:25

回答

5

我会做,以缩短它会像做的唯一的事情(与SQL过程也许?):

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

+0

这就是一点点清洁大声笑 – 2012-07-11 18:34:09

0

另一种方法它是

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

这可能会略短。只要确保报价之间没有空格。

5

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

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

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_[email protected] AND [email protected]; 
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 [email protected] AND [email protected]; 
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> 

从那里,只需执行SQL使用PREPARE或通过SQL到PHP mysql_query

0

另一种方法是只需添加像下面

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

列如果任一列没有字符数据类型,则该列已被转换使用转换函数

为char
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条件。

0
SELECT * 
FROM table1 
WHERE CONCAT(val1, val2, val3, ...) is not Null 
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 

相关问题