表
---------------------------------------------
| id | first_name | middle_name | last_name |
---------------------------------------------
| 1 | abc | | def |
---------------------------------------------
| 2 | | | xyz |
---------------------------------------------
| 3 | xyz | | |
---------------------------------------------
我想要sql查询,它将输出作为包含值的字段名称,并排除具有空值或空值的字段。
像
ID, 名字, 姓氏
答案 0 :(得分:4)
首先尝试,看结果小提琴:
http://sqlfiddle.com/#!2/b6d7b/7
SELECT
CONCAT_WS(',',
IF(id IS NULL, NULL, 'id'),
IF(first_name IS NULL, NULL, 'first_name'),
IF(middle_name IS NULL, NULL, 'middle_name'),
IF(last_name IS NULL, NULL, 'last_name')
)
FROM person
据我所知,您无法创建使用动态创建的表/字段名称的MySQL查询。查询优化器必须在实际执行之前确切地知道查询中将使用哪些表和字段,这就是上述查询包含手动编写的字段名称的原因。
虽然您可以使用INFORMATION_SCHEMA
创建有关数据库列的查询,但您不能使用收到的列名进行查询,除非您使用php代码,存储过程等生成所需的sql代码。
请参阅http://dev.mysql.com/doc/refman/5.0/en/columns-table.html
如果你想在名字中找到'joh'的人,并且字段名实际上包含'joh',你可以使用类似的查询:
http://sqlfiddle.com/#!2/f2597/3
SELECT
id AS person_id,
CONCAT_WS(',',
IF(first_name LIKE '%joh%', 'first_name' , NULL),
IF(middle_name LIKE '%joh%', 'middle_name' , NULL),
IF(last_name LIKE '%joh%', 'last_name' , NULL)
) AS name_parts
FROM person
WHERE first_name LIKE '%joh%'
OR middle_name LIKE '%joh%'
OR last_name LIKE '%joh%';
如果你想要每个列名,那个列中至少有一个NOT NULL值,那么试试这个查询:
http://sqlfiddle.com/#!2/8dec7/5
SELECT
CONCAT_WS(',',
IF(COUNT(id )>0, 'id' ,NULL),
IF(COUNT(first_name )>0, 'first_name' ,NULL),
IF(COUNT(middle_name )>0, 'middle_name',NULL),
IF(COUNT(last_name )>0, 'last_name' ,NULL)
)
FROM person;
它使用COUNT(expr),(http://dev.mysql.com/doc/refman/5.1/en/group-by-functions.html#function_count)Returns a count of the number of non-NULL values of expr
。