我有一个表,其中的记录在某些列中有空白/空数据,我想查找所有列的值不是空/空的记录,而无需创建非常长的 SQL 语句。
例如:
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
如果您有时只想查看所有列中包含数据的行,我建议您根据上面发布的查询创建一个视图。这样你就可以以更优雅、更短的方式与之交互。
视图是一种基于查询的“虚拟表”。如果您经常想要进行某种复杂的连接或过滤,那么使用视图可以大大简化您需要在其他地方编写的查询。
总结所有列的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>
从那里,只需使用执行 SQLPREPARE
或将 SQL 传递给 PHPmysql_query
SELECT *
FROM table1
WHERE CONCAT(val1, val2, val3, ...) is not Null
好吧,没有办法缩短它,但是下面的查询可以使它对任何表都通用。
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 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
.
仅添加如下列的另一种方法
SELECT *
FROM table1
WHERE (val1 + val2 + val3) IS NOT NULL
如果任何列不是字符数据类型,则必须使用强制转换函数将该列转换为 char
另一种方法是
SELECT * FROM table1 WHERE val1 AND val2 AND val3 AND val4 is <> '';
这可能会稍微短一些。只要确保引号之间没有空格即可。