2012-07-11 76 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 

相關問題