2012-07-11 18 views
6

Ho una tabella con record che hanno dati vuoti/nulli in determinate colonne e voglio trovare record dove le colonne ALL hanno un valore diverso da vuoto/nullo senza creare una dichiarazione SQL davvero lunga.Selezione record in cui tutte le colonne hanno dati e non sono nulle

EG:

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

Esiste un modo per accorciare questo? O c'è un modo per farlo in modo diverso

+0

Questo è il modo ovvio ... Sono curioso di vedere se qualcuno riesce a inventare un'abbrevia abbreviazione, però. (Anche se sospetto che il tuo metodo sia il più efficiente) – Flimzy

risposta

5

L'unica cosa che vorrei fare per abbreviare sarebbe di fare qualcosa di simile (con una procedura di SQL forse?):

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

+0

questo è un po 'più pulito –

0

Un altro modo per farlo è

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

Questo può essere leggermente più breve. Assicurati che non ci sia spazio tra le virgolette.

5

Se a volte si desidera esaminare solo le righe che contengono dati in tutte le colonne, suggerirei creating a view in base alla query che hai postato sopra. In questo modo puoi interagire con esso in un modo più elegante e più breve.

Una vista è una sorta di "tabella virtuale" basata su una query. Se si desidera eseguire regolarmente un collegamento o un filtro complesso, l'utilizzo di una vista può semplificare notevolmente le query che è necessario scrivere altrove.

1

Sommare la funzione ISNULL su tutte le colonne.

SELECT * FROM table1 WHERE 
ISNULL(val1)+ISNULL(val2)+ISNULL(val3)+ISNULL(val4)=0; 

Se è pari a 0, quindi tutte le colonne hanno i dati

Se la tabella che si desidera testare semplicemente ha troppe colonne per controllare e sarebbe vero e proprio lavoro di routine per tipo, uso INFORMATION_SCHEMA.COLUMN scolpire la domanda per te.

creo una tabella chiamata test.mytable che assomiglia a questo:

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) 

È possibile utilizzare le seguenti istruzioni per generare la mia domanda per questa tabella

SET @MyDB = 'test'; 
SET @MyTB = 'mytable'; 
SELECT CONCAT(GROUP_CONCAT(CONCAT('ISNULL(',column_name,')') SEPARATOR '+'),'=0') 
INTO @WhereClause FROM information_schema.columns 
WHERE [email protected] AND [email protected]; 
SET @SQLStmt = CONCAT('SELECT * FROM ',@MyDB,'.',@MyTB,' WHERE ',@WhereClause); 
SELECT @SQLStmt\G 

Corriamo quelle dichiarazioni e vedere cos'è prodotto 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> 

Da lì, è sufficiente eseguire SQL utilizzando PREPARE o passare lo SQL in PHP mysql_query

0

Un altro modo per aggiungere solo colonne come sotto

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

Se una delle colonne non sono tipo di dati carattere allora tale colonna deve essere convertito in char utilizzando funzione getto

0

Beh, non c'è modo di accorciarlo, ma la query qui sotto può renderla generica per qualsiasi tabella.

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; 

sostituire 'tabla1' con il nome della tabella che si sta eseguendo la query per e si avrà il risultato.

In pratica, questo sql dinamico interroga la tabella sys.columns per ottenere tutte le colonne che appartengono alla tabella e aggiunge la condizione IS NOT NULL ad essa.

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; 

assicurarsi di cambiare:

>> 1- YOUR_TABLE by the name of your table            
    >> 2- OWNER_DEV by the name of your owner 

.

Problemi correlati