我想有一个表的列的列表,其中至少有一个非NULL数据条目.
换句话说,我想获取以下列返回至少一个条目的列名:
SELECT DISTINCT column_name FROM table WHERE column_name IS NOT NULL
Run Code Online (Sandbox Code Playgroud)
我尝试了以下方法:
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
)
Run Code Online (Sandbox Code Playgroud)
但是这也会返回所有条目所在的列名NULL.
那么我如何只获得那些非NULL条目的列呢?
egg*_*yal 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.
Run Code Online (Sandbox Code Playgroud)
(人们可以省略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;
Run Code Online (Sandbox Code Playgroud)
在sqlfiddle上看到它.
| 归档时间: |
|
| 查看次数: |
17543 次 |
| 最近记录: |