Первая попытка, см скрипку результат:
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
, вы не можете использовать полученные имена столбцов для запроса, если если вы не генерировать необходимый код SQL с помощью PHP кода, хранимые процедуры и т.д.
См 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 (выражение), который (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
.
И в чем ваш вопрос? – Melvin
Я хочу только имя поля, которое содержит значение –
Любое значение (NOT NULL или не пустые строки) или определенное значение? – biziclop