2012-07-11 19 views
6

Tengo una tabla con registros que tienen datos en blanco/nulos en ciertas columnas y quiero encontrar registros donde TODAS las columnas tienen un valor que no sea en blanco/nulo sin crear una declaración de SQL realmente larga.Seleccionar registros donde todas las columnas tienen datos y no son nulas

Ejem:

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

¿Hay alguna manera de acortar esto? O ¿hay alguna manera de hacer esto de manera diferente

+0

Esa es la manera obvia ... Tengo curiosidad por ver si alguien puede encontrar una taquigrafía inteligente, sin embargo. (Aunque sospecho que su método será el más eficiente) – Flimzy

Respuesta

5

La única cosa que haría para acortar sería hacer algo así (con un procedimiento de SQL tal vez?):

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

+0

eso es un poco más limpio lol –

0

Otra forma de hacer es

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

Esto puede ser un poco más corto. Solo asegúrate de que no haya espacio entre las comillas.

5

Si a veces desea ver únicamente las filas que contienen datos en todas las columnas, sugeriría creating a view según la consulta que publicó anteriormente. De esta forma puedes interactuar con él de una manera más elegante y más corta.

Una vista es una especie de "tabla virtual" que se basa en una consulta. Si regularmente desea realizar algún tipo de unión o filtrado complejo, usar una vista puede simplificar en gran medida las consultas que necesita para escribir en otro lugar.

1

Resumir la función ISNULL en todas las columnas.

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

Si el total es 0, entonces todas las columnas tienen datos

Si la tabla que desea probar simplemente tiene demasiadas columnas para comprobar y sería verdadera tarea de escribir, el uso INFORMATION_SCHEMA.COLUMN para esculpir la consulta para ti

puedo crear una tabla llamada test.mytable que se parece a esto:

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) 

Puede utilizar las siguientes declaraciones para generar mi consulta para esta tabla

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 

Vamos a ejecutar esas declaraciones y ver qué SQL se produce

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> 

Desde allí, simplemente ejecute el SQL usando PREPARE o pasar el SQL en PHP mysql_query

0

Otra forma de simplemente añadir columnas, como a continuación

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

Si cualquiera de las columnas no son el tipo de datos de carácter entonces que la columna se tiene que convertir a char usando función de conversión

0

Bueno, no hay forma de acortarlo, pero la consulta siguiente puede hacerlo genérico para cualquier tabla.

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; 

reemplace 'table1' con el nombre de la tabla que está consultando y obtendrá el resultado.

Básicamente este sql dinámico consulta la tabla sys.columns para obtener todas las columnas que pertenecen a la tabla y le agrega la condición 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; 

Asegúrese de cambiar:

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

.

Cuestiones relacionadas