我有一個記錄在某些列中有空白/空數據的表,並且我想查找其中所有列都具有非空值/空值而不創建的記錄一個非常長的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