第一次尝试,结果见 fiddle:
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
。