sql >> データベース >  >> RDS >> Mysql

エントリがnullではない列名を選択します

    INFORMATION_SCHEMA.COLUMNSから作成します 実行するSQLを含む文字列をテーブル化し、ステートメントを準備する その文字列から実行します。

    構築したいSQLは次のようになります:

      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.
    

    WHEREを省略できます 句と置換COUNT(*) COUNT(column)の場合 、しかし私は考えます インデックス付きの列では効率が低下する可能性があります。

    これは、次を使用して実行できます。

    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;
    

    sqlfiddle でご覧ください 。



    1. 生命保険データモデル

    2. デフォルトの日付形式を変更するlaravelsqlクエリ

    3. MySQLデータとハッシュ化されたパスワードを使用したPHPログイン

    4. PostgreSQL GROUP BYはMySQLとは異なりますか?