2012-07-11 14 views
6

Mam tabelę z rekordami, które zawierają puste/puste dane w niektórych kolumnach i chcę znaleźć rekordy, w których kolumny mają wartość inną niż puste/puste, bez tworzenia naprawdę długa instrukcja SQL.Wybieranie rekordów, w których wszystkie kolumny mają dane i nie są one puste null

EG:

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

Czy istnieje jakiś sposób, aby skrócić ten? Czy jest jakiś sposób, aby to zrobić inaczej

+0

To jest oczywisty sposób ... Jestem ciekawy, czy ktoś może wymyślić sprytny skrót. (Chociaż podejrzewam, że twoja metoda będzie najskuteczniejsza) – Flimzy

Odpowiedz

5

Jedyną rzeczą, którą chciałbym zrobić, aby skrócić byłoby zrobić coś takiego (z procedury SQL może?):

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

+0

To jest trochę czystsze lol –

0

Innym sposobem, aby zrobić jest to

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

Może być nieco krótszy. Po prostu upewnij się, że nie ma odstępu między cytatami.

5

Jeśli czasami chcesz spojrzeć tylko na wiersze zawierające dane we wszystkich kolumnach, sugerowałbym creating a view na podstawie zapytania zamieszczonego powyżej. W ten sposób możesz wchodzić w interakcje z nim w bardziej elegancki i krótszy sposób.

Widok jest rodzajem "wirtualnego stołu", który jest oparty na zapytaniu. Jeśli regularnie chcesz wykonać złożone łączenie lub filtrowanie, użycie widoku znacznie uprości zapytania, które musisz napisać w innym miejscu.

1

Podsumuj funkcję ISNULL dla wszystkich kolumn.

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

Jeśli wynosi 0, wówczas wszystkie kolumny mają dane

Jeśli tabela chcesz przetestować po prostu ma zbyt wiele kolumn, aby sprawdzić i byłoby prawdziwą udręką dla danego typu, stosowanie INFORMATION_SCHEMA.COLUMN rzeźbić zapytanie dla ciebie.

utworzyć tabelę o nazwie test.mytable który wygląda tak:

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) 

można wykorzystywać następujące instrukcje do generowania moje zapytanie do tej tabeli

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 

Uciekajmy te oświadczenia i zobaczyć co SQL jest produkowane

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> 

Stamtąd wystarczy uruchomić SQL za pomocą PREPARE lub przekazać SQL w PHP mysql_query

0

Innym sposobem, aby po prostu dodać kolumny jak poniżej

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

Jeżeli którykolwiek z kolumn nie są typem danych charakter wówczas, że kolumna musi zostać przekształcony do char użyciem funkcji rzucania

0

Cóż, nie ma sposobu, aby to skrócić, ale poniższe zapytanie może sprawić, że będzie ono ogólne dla każdej tabeli.

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; 

zamień "table1" na nazwę tabeli, do której chcesz wysłać zapytanie, a otrzymasz wynik.

Zasadniczo to dynamiczne sql zapytuje tabela sys.columns, aby uzyskać wszystkie kolumny, które należą do tabeli i dołącza do niej warunek 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; 

Pamiętaj, aby zmienić:

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

.

Powiązane problemy