mysql获取包含值的字段名称

时间:2012-06-22 10:10:01

标签: php mysql

---------------------------------------------
| id | first_name | middle_name | last_name |
---------------------------------------------
| 1  | abc        |             | def       |
---------------------------------------------
| 2  |            |             | xyz       |
---------------------------------------------
| 3  |  xyz       |             |           |
---------------------------------------------          

我想要sql查询,它将输出作为包含值的字段名称,并排除具有空值或空值的字段。

ID, 名字, 姓氏

1 个答案:

答案 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_countReturns a count of the number of non-NULL values of expr