我有一个记录在某些列中有空白/空数据的表,并且我想查找其中所有列都具有非空值/空值而不创建的记录一个非常长的SQL语句。选择所有列都有数据且不为空的记录
EG:
SELECT * FROM table
WHERE col1 IS NOT NULL AND col2 IS NOT NULL AND col3 IS NOT NULL AND...
有什么办法缩短这个?或者有没有办法做到这一点不同
我有一个记录在某些列中有空白/空数据的表,并且我想查找其中所有列都具有非空值/空值而不创建的记录一个非常长的SQL语句。选择所有列都有数据且不为空的记录
EG:
SELECT * FROM table
WHERE col1 IS NOT NULL AND col2 IS NOT NULL AND col3 IS NOT NULL AND...
有什么办法缩短这个?或者有没有办法做到这一点不同
我会做,以缩短它会像做的唯一的事情(与SQL过程也许?):
SELECT * FROM table1 WHERE (val1 AND val2 AND val3 AND val4) IS NOT NULL
这就是一点点清洁大声笑 – 2012-07-11 18:34:09
另一种方法它是
SELECT * FROM table1 WHERE val1 AND val2 AND val3 AND val4 is <> '';
这可能会略短。只要确保报价之间没有空格。
如果您有时只想查看所有列中包含数据的行,我建议您根据上面发布的查询建议creating a view。这样你可以以更优雅和更短的方式与它进行交互。
视图是一种基于查询的“虚拟表”。如果您经常想要进行某种复杂的连接或过滤,那么使用视图可以大大简化您需要在别处编写的查询。
总结所有列上的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
另一种方法是只需添加像下面
SELECT *
FROM table1
WHERE (val1 + val2 + val3) IS NOT NULL
列如果任一列没有字符数据类型,则该列已被转换使用转换函数
为char那么有没有办法缩短它,但下面的查询可以使它通用的任何表。
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
条件。
SELECT *
FROM table1
WHERE CONCAT(val1, val2, val3, ...) is not Null
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
。
这是显而易见的方式......我很好奇,看看是否有人可以想出一个聪明的速记,但。 (虽然我怀疑你的方法将是最有效的) – Flimzy 2012-07-11 18:23:25