-2

桌子

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

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

id, first_name, last_name

4

1 回答 1

4

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

于 2012-06-22T10:32:07.937 回答