2013-07-01 14 views
9

PSEUDO:C'è un modo per verificare null su tutte le colonne in un carattere jolly selezionare?

select * from foo where [every column is not null] 

C'è un modo per farlo senza specificare i nomi di colonna effettivi?

+1

Temo di no - hai avuto modo di nominarli tutti. –

+0

Solo una domanda sul perché non conosci i nomi del tuo tavolo? – bugwheels94

+0

@Ankit, come accade sto lavorando con una tabella derivata dinamica che può avere tutti i tipi di colonne e tutti i tipi di nomi. Naturalmente posso costruire una stringa elaborata e brutta di AND, ma speravo di evitarlo (e penso che tu intenda i nomi delle mie colonne). –

risposta

6

Una possibile soluzione che posso pensare implica l'utilizzo dinamico SQL

SELECT GROUP_CONCAT(column_name SEPARATOR ' IS NOT NULL AND ') 
    INTO @sql 
    FROM INFORMATION_SCHEMA.COLUMNS 
WHERE table_schema = SCHEMA() 
    AND table_name = 'foo' 
GROUP BY table_name; 

SET @sql = CONCAT('SELECT * FROM foo WHERE ', @sql, ' IS NOT NULL'); 

PREPARE stmt FROM @sql; 
EXECUTE stmt; 
DEALLOCATE PREPARE stmt; 

Qui è SQLFiddle demo


Ovviamente può essere avvolto in una stored procedure con un parametro per il nome di una tabella

DELIMITER $$ 
CREATE PROCEDURE sp_select_all_not_null(IN tbl_name VARCHAR(64)) 
BEGIN 
    SELECT GROUP_CONCAT(column_name SEPARATOR ' IS NOT NULL AND ') 
    INTO @sql 
    FROM INFORMATION_SCHEMA.COLUMNS 
    WHERE table_schema = SCHEMA() 
    AND table_name = tbl_name 
    GROUP BY table_name; 

    SET @sql = CONCAT('SELECT * FROM ', tbl_name, ' WHERE ', @sql, ' IS NOT NULL'); 

    PREPARE stmt FROM @sql; 
    EXECUTE stmt; 
    DEALLOCATE PREPARE stmt; 
END 
DELIMITER ; 

e quindi utilizzarlo

CALL sp_select_all_not_null('foo'); 

Ecco SQLFiddle demo per quel

+0

ah ... è molto bello. Darò una prova. Grazie. –

+0

@ Dr.Dredel Sei più che benvenuto :) Fai un giro. Puoi anche dare un'occhiata all'esempio di sqlfiddle che ho postato. – peterm

Problemi correlati