sql >> Database teknologi >  >> RDS >> Mysql

Vælg kolonnenavne, hvis indtastninger ikke er nul

Opret fra INFORMATION_SCHEMA.COLUMNS tabel en streng, der indeholder den SQL, du ønsker at udføre, derefter udarbejde en erklæring fra den streng og udfør den.

Den SQL, vi ønsker at bygge, vil se sådan ud:

  SELECT 'column_a'
  FROM   table_name
  WHERE `column_a` IS NOT NULL
  HAVING COUNT(*)
UNION ALL
  SELECT 'column_b'
  FROM   table_name
  WHERE `column_b` IS NOT NULL
  HAVING COUNT(*)
-- etc.

(Man kunne udelade WHERE klausul og erstat COUNT(*) for COUNT(column) , men jeg tror der kan være mindre effektivt på indekserede kolonner).

Dette kan gøres ved hjælp af følgende:

SET group_concat_max_len = 4294967295;

SELECT GROUP_CONCAT(
 ' SELECT ',QUOTE(COLUMN_NAME),
 ' FROM   table_name',
 ' WHERE `',REPLACE(COLUMN_NAME, '`', '``'),'` IS NOT NULL',
 ' HAVING COUNT(*)'
SEPARATOR ' UNION ALL ')
INTO   @sql
FROM   INFORMATION_SCHEMA.COLUMNS
WHERE  TABLE_SCHEMA = DATABASE()
   AND TABLE_NAME = 'table_name';

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

Se den på sqlfiddle .



  1. Databasetest i python, postgresql

  2. Databasemodellering for en svag enhed

  3. SQL-forespørgsel for at vælge forskellige rækker fra venstre tabel efter indre joinforbindelse til højre tabel

  4. Undgå sorteringer med Merge Join-sammenkædning