最初に試してみてください。結果についてはフィドルを参照してください。
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%';
その列に少なくとも 1 つの 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
。