2017-03-24 114 views
0

我有一个包含下表结构和条目的表。 我想编写一个查询,它会给我一个特定行的列名,这个行的值对应于一个特定的用户。 Like name = mayur我想输出为 “公司性别公民”,但不是其他人,因为它们的值为NULL。无法写入SQL查询

注意: 1.OMIT“名称,ID密码,电子邮件”列。 2.由于管理员有权添加或删除列,所有列名称可能会更改。 enter image description here

请帮我写SQL查询。

+0

获得回列_names_作为一个奇怪的请求罢工我。你确定要这么做吗?还是你想在这些列中使用_values_? –

+0

我想获取除名称,IS,密码,电子邮件,公司,性别和公民以外的特定用户的列名称。 –

+0

你可以从这里获得帮助................ SELECT * FROM information_schema.COLUMNS WHERE table_schema ='schema_name'AND table_name ='table_name'; –

回答

0

试试这个:

SELECT 
    CASE WHEN Company IS NULL THEN 'Company, ' ELSE '' END 
+ CASE WHEN Gender IS NULL THEN 'Gender, ' ELSE '' END 
+ CASE WHEN Citizen IS NULL THEN 'Citizen, ' ELSE '' END 
-- + ... -- add CASE statement for all other relevant columns 
FROM Table_Name 
WHERE Name = 'mayur' 

您将需要清除最后一个逗号创建的,但我认为这也没什么大不了的。

+0

所有列名称可能会更改,因为管理员有权添加或删除列。我无法硬编码列的名称。 –

0

试试这个,在以前的响应只需稍加修改

SQL Server版本

DECLARE @query as varchar(max); 
SET @query='select '+stuff((select '+'+'CASE WHEN ['+COLUMN_NAME+'] is null THEN '''+COLUMN_NAME+ ''' ELSE '''' END' from information_schema.columns where table_name = 'users' AND COLUMN_NAME not in ('Name', 'ID', 'Password', 'Email') for xml path('')),1,1,'')+' from users WHERE [name]=''mayur'' '; 
execute(@query) 

MySQL版本

SELECT GROUP_CONCAT(CONCAT('CASE WHEN `',`COLUMN_NAME`,'` is null THEN ''',COLUMN_NAME,''' ELSE '''' END ')) into @casestmt 
FROM `INFORMATION_SCHEMA`.`COLUMNS` WHERE `TABLE_NAME`='users'; 
set @query="select @casestmt from users WHERE name='mayur'"; 
PREPARE stmt1 from @query; 
EXECUTE stmt1; 

这将产生相同的查询,其中@Giorgos Altanis曾建议唯一的区别是该列名将被自动提取为表定义。 如果你不想创建Proc,那么你可以立即执行所有的语句,它会给你想要的输出

+0

你能帮我准确的查询格式,以便我可以查看解释。 –

+0

而且它看起来像一个存储过程。直接查询或多个查询将帮助我实现它。 –

+0

我已根据您的要求更新了查询。为此,我创建了动态查询。材料部分用于创建@Giorgos Altanis在回复中提出的Case语句。然后将它与您的餐桌结合在一起,为您提供所需的结果。 –