2013-07-01 11 views
9

PSEUDO:Czy istnieje sposób sprawdzania wartości zerowej we wszystkich kolumnach w wyborze wieloznacznym?

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

Czy istnieje sposób to zrobić bez podania rzeczywistych nazw kolumn?

+1

nie boi - masz je wszystkie wymienić. –

+0

Po prostu pytanie, dlaczego nie znasz nazw swojego stołu? – bugwheels94

+0

@Ankit, Jak to się dzieje, pracuję z tabelą dynamiczną, która może mieć wszystkie rodzaje kolumn i różnego rodzaju nazwy. Oczywiście mogę skonstruować skomplikowany i brzydki ciąg znaków AND, ale miałem nadzieję, że tego uniknę (i myślę, że masz na myśli nazwy moich kolumn). –

Odpowiedz

6

Możliwym rozwiązaniem, które mogę myśleć polega na wykorzystaniu dynamicznego 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; 

Oto SQLFiddle demo


Oczywiście może to być opakowane w procedurze przechowywanej z parametrem dla tabeli o nazwie

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 ; 

a następnie użyć go

CALL sp_select_all_not_null('foo'); 

Oto SQLFiddle demo dla tego

+0

ah ... to bardzo fajne. Spróbuję. Dzięki. –

+0

@ Dr.Dredel Serdecznie zapraszamy :) Daj się zakręcić. Możesz również rzucić okiem na przykład na sqlfiddle, który opublikowałem. – peterm

Powiązane problemy