sql >> Databasteknik >  >> RDS >> Mysql

Välj kolumnnamn vars poster inte är null

Skapa från INFORMATION_SCHEMA.COLUMNS tabell en sträng som innehåller den SQL du vill köra, sedan förbereda ett uttalande från den strängen och kör den.

Den SQL vi vill bygga kommer att se ut så här:

  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 kan utelämna WHERE sats och ersätt COUNT(*) för COUNT(column) , men jag tror som kan vara mindre effektivt på indexerade kolumner).

Detta kan göras med följande:

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. Returnera kolumninformation för en lagrad procedur i SQL Server:sp_sproc_columns

  2. Får fel Olaglig blandning av sammanställningar (utf8mb4_unicode_ci,IMPLICIT) och (utf8mb4_general_ci,IMPLICIT) för operation '='

  3. Gå med två bord i Php

  4. Oracle 10:Använder HEXTORAW för att fylla i blobdata