1

少なくとも1つの非NULLデータエントリを含むテーブルの列のリストが必要です。

つまり、次のように少なくとも1つのエントリが返される列名を取得したいと思います。

SELECT DISTINCT column_name FROM table WHERE column_name IS NOT NULL

私は次のことを試しました:

SELECT column_name
FROM information_schema.columns
WHERE table_name = "table_name"
AND EXISTS (
    SELECT DISTINCT column_name FROM table_name WHERE column_name IS NOT NULL
)

ただし、これにより、すべてのエントリがある列名も返されますNULL

NULLでは、エントリ以外の列のみを取得するにはどうすればよいですか?

4

2 に答える 2

10

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でそれを参照してください。

于 2012-11-15T17:26:19.110 に答える
0

この手順を使用すると、null行ではない行が少なくとも1つあるテーブルの列名が出力されます。

create or replace procedure list_col_notNull(tblName in varchar2)
as
lv_col_name varchar2(200);
lv_ctr number;
lv_sql varchar2(400);
CURSOR cur_col_name is
SELECT column_name
FROM USER_TAB_COLUMNS U
WHERE table_name = tblName order by column_name asc;
begin
open cur_col_name;

LOOP
    FETCH cur_col_name INTO lv_col_name; 
    EXIT WHEN cur_col_name%NOTFOUND; 
    lv_sql := 'select count(1) From ' || tblName || ' where ' || lv_col_name || ' is not null'  ;  
    EXECUTE IMMEDIATE lv_sql into lv_ctr;
    if lv_ctr > 0
    then
        dbms_output.put_line(lv_col_name);
    end if;
于 2013-07-23T09:39:22.163 に答える