2012-06-22 4 views
-2

ТаблицыMySQL получить имя поля, которое содержит значение,

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

Я хочу SQL запроса, который дает выход в поле имени, которое содержит значение и исключение поля, имеет пустое значение или нулевое значение.

как

идентификатор, first_name, last_name

+0

И в чем ваш вопрос? – Melvin

+0

Я хочу только имя поля, которое содержит значение –

+0

Любое значение (NOT NULL или не пустые строки) или определенное значение? – biziclop

ответ

3

Первая попытка, см скрипку результат:

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.

+0

Nice one :-) +1 – Vimalnath

+0

Он не работает с несколькими записями :( –

+0

Итак, вы хотите, чтобы имена столбцов имели по крайней мере одну заполненную строку во всей таблице? – biziclop